[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    tools->options->text editor->C/C++
    там поставьте галочку на Line Numbers.
     
  2. evildead

    evildead New Member

    Joined:
    29 Jan 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    да...только этих настроек нет в visual studio 6....
     
  3. Скотти

    Скотти Member

    Joined:
    17 Sep 2009
    Messages:
    23
    Likes Received:
    8
    Reputations:
    0
    есть библиотека на дельфи
    Code:
    procedure PrintHello(title:pWidechar);
    begin
      MessageBox(0, 'Hello', title,MB_OK);
    end;
    
    exports
      PrintHello;
    
    begin
    end.
    
    и есть программа на висуал студио 2008 с таким кодом:
    Code:
    typedef void (*ULPRET)(LPSTR);
    ULPRET DLLProc;
    				
    HINSTANCE hDll;
    hDll=LoadLibrary("Project1.dll");
    DLLProc=(ULPRET)GetProcAddress(hDll, "PrintHello");
    	
    char sz[]="text title";			
    (*DLLProc)((LPSTR) sz);
    FreeLibrary(hDll);
    
    при вызове в messagebox не отображается заголовок. В чем ошибка?
     
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Соглашения вызовов не совпадают. Сишка по умолчанию использует cdecl, а дельфи - pascal или fdastcall. Нужно либо в длл, либо в вызывающей программе указать соглашение вызова правильное. Либо и там и там одинаковое указать, stdcall например.
     
  5. Скотти

    Скотти Member

    Joined:
    17 Sep 2009
    Messages:
    23
    Likes Received:
    8
    Reputations:
    0
    GRRRL Power
    Исправил на
    procedure PrintHello(title:pWidechar);stdcall;
    и
    typedef void (_stdcall *ULPRET)(LPSTR);
    Проблема такая же: вместо текста сообщения каша.
     
    #6365 Скотти, 21 Apr 2011
    Last edited: 21 Apr 2011
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    То что функция в дельфи принимает строку в unicode, а из сишника вызывается с передачей строки в ansii, тоже не очень хорошо.
     
    1 person likes this.
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    а раньше ты писал
    а какой размер char'a в C++? PWideChar указывает на буффер с 2-байтными символами
     
    1 person likes this.
  8. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    ставьте точеку останова внутри длл и запускайте под отладчиком прогу которая грузит эту длл
    отладчик остановится внутри длл и пошагово сможете прогнать вывод message box'а
     
    1 person likes this.
  9. Скотти

    Скотти Member

    Joined:
    17 Sep 2009
    Messages:
    23
    Likes Received:
    8
    Reputations:
    0
    GhostOnline, под этими двумя фразами я имел ввиду одно и тоже.
    Например, передаем строку eeeee, а в заголовке отображается [][]e[][]
    С pwidechar & pchar эксперементировал, разницы нет.
     
  10. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Отображаются "кракозябры" и совсем не отображается - большая разница.

    В какой версии дельфи скомпилирована dll? Имей ввиду что в версиях от 2009 PChar эквивалетен PWideChar, а раньше PAnsiChar.

    http://stackoverflow.com/questions/3949046/passing-pchar-char-between-c-and-delphi-dll
     
  11. Скотти

    Скотти Member

    Joined:
    17 Sep 2009
    Messages:
    23
    Likes Received:
    8
    Reputations:
    0
    извиняюсь.

    В Delphi 2010.
     
  12. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Пропиши явно PAnsiChar

    100% проблема с длиной строки
     
  13. Скотти

    Скотти Member

    Joined:
    17 Sep 2009
    Messages:
    23
    Likes Received:
    8
    Reputations:
    0
    procedure PrintHello(title:pAnsiChar); stdcall;
    begin

    MessageBox(0, 'Hello', pchar(title),MB_OK);
    end;

    Сделал так.
    Теперь ошибка в программе на Си. Вылетаем со словами:
    UPD.
    А если так:
    procedure PrintHello(titleAnsiChar);
    begin
    MessageBox(0, 'Hello', pchar(title),MB_OK);
    end;

    то без ошибки, но результат тот же- в title кракозяблы
     
    #6373 Скотти, 21 Apr 2011
    Last edited: 21 Apr 2011
  14. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    зачем stdcall убрал? // туплю забыл что объявление и имплементация в дельфи отдельно

    ну вообще пробуй char*, и выделять на байт больше чем надо, и ставить последний байт в ноль. То есть если нужно передать "lol" то по факту передавай "lol\0"
    а в dll пробуй PAnsiChar или AnsiString, в общем экспериментируй, у меня нет ни того ни другого компилятора, проверить не могу
     
    #6374 GhostOnline, 21 Apr 2011
    Last edited: 21 Apr 2011
    1 person likes this.
  15. RaTeN

    RaTeN New Member

    Joined:
    19 Aug 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Смотрите условие Дан текстовый файл (файл состоящий из строк) F, содержащий программу на языке С. Проверить эту программу на несоответствие числа открывающихся и закрывающихся круглых скобок.
    Code:
    void main()
    {
    	SetConsoleOutputCP(1251);
    	FILE *file;
    	file = fopen("test.txt", "r");
    	int i=0, r=0, o=0;
    	char k[999], *result;
    /*	do
    	{
    		r=fgetc(file);
    		if(r==40) i++;
    		else if(r==41) i--;
    		
    	}
    	while(!feof(file));
    	if(i==0) cout<<"Количество открывающихся и закрывающихся скобок одинаково"<<endl;
    	else cout<<"Количество открывающихся и закрывающихся скобок неравно"<<endl;
    }*/
    
    	do
    	{
    		result=fgets(k,999, file);
    		r=strlen(k);
    		for(i=0;i<r;i++)
    		{
    		cout<<k[i];
    			if(k[i]==40) o++;
    			else if(k[i]==41) o--;
    		}
    	}
    	while(!feof(file));
    
    	
    	if(o==0) cout<<"Количество открывающихся и закрывающихся скобок одинаково"<<endl;
    	else cout<<"Количество открывающихся и закрывающихся скобок неравно"<<endl;
    	
    }
    
    
     
  16. RaTeN

    RaTeN New Member

    Joined:
    19 Aug 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Вопрос... а как сделать чтобы не if(k==40), а if(k==")")
    не могу найти...
     
  17. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    if(k==')')
     
    1 person likes this.
  18. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Code:
    o--;
    
    )))
    похоже на ключ
     
  19. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    да, это ахтунг, когда переменные называют o или l.
    RaTeN, рекомендую почитать Роберта Мартина "Чистый Код".
     
  20. K800

    K800 Nobody's Fool

    Joined:
    25 Dec 2010
    Messages:
    2,190
    Likes Received:
    3,822
    Reputations:
    372
    8 people like this.
Thread Status:
Not open for further replies.