2016-01-27 3 views
2

Я пытаюсь что-то (изначально исходит от here) о проекте «Куча и указатель на проекте консоли C#». И моя программа выглядит следующим образом:Проблема с преобразованием типа в C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 

public class Win32 
{ 
[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr malloc(int size); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern int free(IntPtr region); //Change IntPtr befroe free method to int ---update--- 
} 

public class Program 
{ 
    public unsafe void Heap() 
    { 
     int* num1, num2, answer; 
     num1 = Win32.malloc(sizeof(int)); 
     *num1 = 999; // 999 should be the value stored at where pointer num1 refers to 

     num2 = Win32.malloc(sizeof(int)); 
     *num2 = 1; // 1 should be the value stored at where pointer num2 refers to 

     answer = Win32.malloc(sizeof(int)); 
     *answer = *num1 + *num2; // 1000 should be the value of pointer answer's reference 

     Console.WriteLine(*answer); // 1000? 
     Win32.free(num1); 
     Win32.free(num2); 
     Win32.free(answer); 
    } 
} 

После отладки, получил сообщение об ошибке говорит:

Ошибка 1 Не удается неявно преобразовать тип «System.IntPtr» в «междунар *». явного преобразования существует (вы пропали без вести броска?)

error CS1502: The best overloaded method match for 'Win32.free(System.IntPtr)' has some invalid arguments 

error CS1503: Argument 1: cannot convert from 'int*' to 'System.IntPtr' 

Моих вопросов здесь, почему я не могу использовать IntPtr до того таНос и свободно, так как метод обратной пустоты? Какие изменения я должен внести в свои коды? Благодарим за помощь.

--- Update ---

изменение: public static extern IntPtr free(int hWnd); к общественности статической extern int free(IntPtr region);, free(*num) к free(num)

дает дополнительный 'CS1502' и две ошибки 'CS1503'.

--- second Update --- C# сделка куча предмет автоматически. В C# нет эквивалента malloc. Это тупик. T_T

+0

'вы пропали без вести слепок' – Rob

+0

@Rob Проблема заключается в том, что я не думаю, что я скучаю в ролях. И я не знаю, как преобразовать пустоту в int. –

ответ

3

Несколько ошибок:

в C/C++

void * malloc(int sizeToAllocate); 
int free(void * region); 

вы передаете в free значение, возвращенное malloc. Таким образом, ваш импорт должен быть:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr malloc(int size); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern int free(IntPtr region); 

и, следовательно, ваш код должен Высвобождение затем стать:

var num1Ptr = Win32.malloc(sizeof(int)); 
int * num1 = (int*) num1Ptr.ToPointer(); 

... 

var num2Ptr = Win32.malloc(sizeof(int)); 
int * num2 = (int*) num2Ptr.ToPointer(); 

... 

var answerPtr = Win32.malloc(sizeof(int)); 
int * answer = (int*) answerPtr.ToPointer(); 

... 

Win32.free(num1Ptr); 
Win32.free(num2Ptr); 
Win32.free(answerPtr); 
+0

Спасибо за сообщение. Это помогает мне лучше понять, как работает Platform Invoke, и моя ошибка в отношении бесплатного (указателя) вместо бесплатного (значения). Тем не менее, это дает дополнительные две ошибки: CS1502: лучшее перегруженное соответствие метода для «Win32.free (System.IntPtr)» имеет некоторые недопустимые аргументы и «CS1503: Аргумент 1: невозможно преобразовать из« int * »в« System.IntPtr ''. –

+0

Вы правы, возможно, вы просто сделали простой «Win32.free (IntPtr (num1))», но более строгий подход - это обновленное решение. –

+0

Я нашел свою проблему, malloc не найден в user32.dll или другой ссылке, он не имеет эквивалента в C#. Глупо, когда я врезался в тупик и продолжал ударять головой о стену. T_T. –

Смежные вопросы