[ 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. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    Я так уже пробовал, не получилось.

    проблему решил.

    CreateProcess(L"test.exe", L"test.exe -x", 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
     
    #1861 ntldr, 19 Nov 2008
    Last edited: 19 Nov 2008
  2. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    А зачем второй раз test.exe указываешь? Вторым параметром передается аргумент процесса. Если в первом стоит NULL, то во втором надо указывать "имя_модуля аргумент"...
     
  3. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    я знаю, но таким способом у меня почему-то не запускалось вообще
     
  4. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Попробуй вызвать GetLastError(), может узнаешь в чем проблема.
     
    1 person likes this.
  5. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    передача массива в DLL

    постановка задачи: нужно было с функции передать в DLL библиотеку значения А, В, С, и т.д. и одномерный массив для вычисления функции, библиотека возвращает результат операции или же код ошибки (тоже результат 666).
    реализация:

    глобальные переменные
    Code:
    int mas[5];
    int el, g;
    int m_a[5], m_b[5],m_c[5],m_matrix[80];
    int Number;  
    int am,bm,cm;
    
    Функция RUN
    Code:
    void CMyFrameWin::OnRun()
    {
    	char sq[80];
    	FILE *read;
    	read=fopen("matrix.txt","r");
    	
    	
    		while(!feof(read)){
    			for(int g=0;g<5;g++)
    			{
    				fscanf(read,"%d",&el);
    		    mas[g]=el;
    			fscanf(read,"\n");
    			
    			sprintf(sq,"%d", mas[g]);
    			MessageBox(sq,"ELEMENT MASIVA"); // проверка елементов
    			}
    	}
        	
    	int res;
    	HINSTANCE hDll;
    	char s[100];
    	hDll=::LoadLibrary("MyDll");
    	if (hDll == NULL) 
    	{
    		::MessageBox(NULL,"ERROR","ERROR! File MyDll.dll not found!",MB_OK| MB_ICONSTOP);
    	}
    	else 
    	{
    	typedef int (*FUN)(int*,int,int,int,int);
    	FUN func;
    	func=(FUN)::GetProcAddress(hDll, "calc");
        res=(*func)(mas,Number,am,bm,cm);
    	if (res==666)
    	{
    		::MessageBox(NULL,"ERROR! ","DATA ERROR!",MB_OK| MB_ICONSTOP);
    	}
    	else 
    	{ sprintf(s,"%d", res);
    	MessageBox(s,"Result");
    	 //создание и запись результата в файл
         FILE *result;
    	 result=fopen("result.txt","w");
    	 fprintf(result,"%d",res);
    	 fclose(result); 
    	}
    	::FreeLibrary(hDll);
    	}
    
    массив заполняется значениями из файла matrix.txt вида :
    Code:
    0
    1
    2
    3
    4
    
    и собственно сама dll - ка

    Code:
    #include "stdafx.h"
    #include <conio.h>
    
    int calc ( int *mas, int Number, int am, int bm, int cm)
    
    {
    	int r=Number;
    	int a=am,b=bm,c=cm,n=5,resalt;
    	//int mas[5]={0,1,2,3,4};
    	if(r==9){
    	_asm{
    		mov eax,0
    		mov ecx,n
    		lea esi,mas
    l1:
    		add eax,[esi]
    		add esi,4
    		loop l1
    		add eax,c
    		mov resalt,eax
    	}}
    	else if(r<=5){
    		_asm{
    			mov eax,a
    			sub eax,c
    			mov a,eax
    			mov eax,b
    			mul b
    			add eax,a
    			mov ebx,c
    			cdq
    			div ebx
    			mov resalt,eax
    	}}
    	else resalt=666;
    	return resalt;
    }
    
    если массив не передавать а забить в dll типа так
    //int mas[5]={0,1,2,3,4};
    то dll - ка работает нормально, а массив передать никак не получается. В результате получаем хз что.. типа 343987428... и т.д.
    кто разбирается посмотрите что там в коде не так... где то я втыкаю.. или у кого есть ссыль на хелп по передаче массива в dll буду рад почитать.
    спасибо.
     
    _________________________
    1 person likes this.
  6. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    Проблема думаю в том, что mas[0] и mas[1] не идут в памяти друг за другом. а могут указывать на разные адресса в памяти (зависит от компилятора). поэтому здесь нельзя вычислять как mas + Номер элемента*4...
     
    2 people like this.
  7. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    все билдится в Вижуал Студио 2008 с future pack - oм (хотя думаю фьюче пак не при чем)
     
    _________________________
    4 people like this.
  8. groupby

    groupby Elder - Старейшина

    Joined:
    21 Sep 2008
    Messages:
    30
    Likes Received:
    13
    Reputations:
    0
    ни один компилятор СИ не генерирует массив таким образом как вы сказали :D

    То что вы сказали относится к динамическим спискам. Массивы всегда последовательно располагаются в памяти. На этом свойстве массивов основана адресация по указателю.
     
    3 people like this.
  9. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    значить вот такая история с подключением dll..
    сначала когда массив задавался в самой библиотеке
    (int mas[5]={0,1,2,3,4};) все работало без претензий при любом значении int Number, int am, int bm, int cm всегда получали правильное решение.
    библиотека выглядела так:
    Code:
    #include "stdafx.h"
    #include <conio.h>
    
    int calc (int Number, int am, int bm, int cm)
    
    {
    	int r=Number;
    	int a=am,b=bm,c=cm,n=5,resalt;
    	int mas[5]={0,1,2,3,4};
    	if(r==9){
    [B]	   [COLOR=DarkOrange] _asm{
    		mov eax,0
    		mov ecx,n
    		lea esi,mas
            l1:
    		add eax,[esi]
    		add esi,4
    		loop l1
    		add eax,c
    		mov resalt,eax[/COLOR][/B]
    	}}
    	else if(r<=5){
    		 _asm{
    			mov eax,a
    			sub eax,c
    			mov a,eax
    			mov eax,b
    			mul b
    			add eax,a
    			mov ebx,c
    			cdq
    			div ebx
    			mov resalt,eax
    	}}
    	else resalt=666;
    	return resalt;
    }
    
    Другим цветом выделил часть кода которая работает с массивом.

    потом массив я передал с другой функции, так как было описано ТУТ
    для проверки корректности передачи элементов использовал вывод каждого
    Code:
    int calc ( int *mas, int Number, int am, int bm, int cm)
    {
    	int r=Number;
    	int a=am,b=bm,c=cm,n=5,resalt;
    	[B][COLOR=DarkOrange]char sdll[100] = {0};
    	sprintf(sdll,"%d", mas[1]);
    	MessageBoxA(NULL, sdll,"Result", NULL);[/COLOR][/B]
    	if(r==9){..........
    
    тут все нормально. элементы массива корректно могут считываться и использоваться библиотекой.
    но сам асм код который отвечает за обработку массива в результат кидал постоянно значения типа 3645435664 или 8764599943.....
    вышел с положения только С++ кодом... :(
    Code:
    if(r==9){
    	int temp=0;
    	for(int i=0;i<n;i++)
    	 {
    	    temp=temp+mas[i];
    	 }
    	resalt=cm +temp ;
    }
    
    так и не понял почему предыдущий РАБОТАЮЩИЙ асм код для массива который был обьявлен внутри dll не покатил для массива который передаем из другой функции...
    а нужно именно асм код..
    трабла в адресации памяти? или хз?
    кто что посоветует?
    спасибо.

    -------------------EDIT---------------------------
    решение проблемы - пост от bons.
    bons, спасибо.
    -------------------EDIT---------------------------
     
    _________________________
    #1869 NetSter, 20 Nov 2008
    Last edited: 21 Nov 2008
  10. Diablo@Dragon

    Diablo@Dragon Elder - Старейшина

    Joined:
    14 Nov 2007
    Messages:
    69
    Likes Received:
    2
    Reputations:
    -7
    Как мне сделать функцию с параметрами но при этом если параметры незадавать выполнялись параметры по умолчанию
     
  11. ToniKapuchon

    ToniKapuchon Elder - Старейшина

    Joined:
    26 Feb 2006
    Messages:
    153
    Likes Received:
    45
    Reputations:
    -1
    void func(int p=1;int p1=2)
    {
    }
    Не уверен!
     
    1 person likes this.
  12. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    groupby Ну не знаю :))) Я конечно не настаиваю, но вроде такое заметил на Borland C++...
     
    #1872 GlOFF, 20 Nov 2008
    Last edited: 20 Nov 2008
    1 person likes this.
  13. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    2 NetSter
    Не используй инструкцию lea
    вместо lea esi, mas
    напиши mov esi, mas
    - так будет правильно. Компилятор это превратит примерно в следующее:
    mov esi, DWORD PTR [ebp+8]
    то есть занесение в esi содержимого параметра mas и это есть правда.

    P.S.
    а когда ты вместо mov пишешь lea получается:
    lea esi, DWORD PTR [ebp+8]
    что есть занесение в esi адреса переменной mas, что тебе совсем не нужно
     
    #1873 bons, 20 Nov 2008
    Last edited: 20 Nov 2008
    1 person likes this.
  14. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Можно внутри функции сделать проверку на наличие параметров.
     
  15. InfernoNet

    InfernoNet Elder - Старейшина

    Joined:
    7 Nov 2007
    Messages:
    248
    Likes Received:
    228
    Reputations:
    -20
    Элементарный вопрос. Для чего нужно:
    и чем оно отличается от
    ??
     
    2 people like this.
  16. ToniKapuchon

    ToniKapuchon Elder - Старейшина

    Joined:
    26 Feb 2006
    Messages:
    153
    Likes Received:
    45
    Reputations:
    -1
    точка входа в программу функция main(), а vaild ето тип возращаемый ОС тип.... первый раз вижу vaild - где ты ето увидел?
     
  17. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    есть такой код:
    Code:
    struct abs1
    {
    	unsigned char a; //1-byte
    	unsigned short b;//2-byte
    };
    void pr(unsigned char*t)
    {
    	for(int i=0;i<sizeof(t);i++) printf("%x ",t[i]);
    }
    
    int main()
    {
    	abs1 test;
    	test.a = (unsigned char)0x31;
    	test.b = (unsigned short)0x32;
    	printf("Struct size: %d\n",sizeof(test));
    
    	pr((unsigned char*)&test);
    	getchar();
    	return 0;
    }
    
    Выводит:
    Struct size: 4
    31 CC 32 00

    Почему размер структуры 4 если (чар -1баит и шорт-2байта) должен быть 3 байта.

    Лишний байт виден при печати структуры (второй - 0хСС)

    как от него избавится?
     
  18. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Видимо выравнивание вступает в ход.
    Очищать память, CC - мусор.
     
    1 person likes this.
  19. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Если я правильно понимаю после очистки мамяти будет 31 00 32 00, я прав? Мне же необходимо от "лишнего" байта избавится, т.е. структура должна быть размером именно 3 байта.
     
    1 person likes this.
  20. SVAROG

    SVAROG Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    424
    Likes Received:
    86
    Reputations:
    -1
    нужно прочесть данные из реестра, тип данных REG_SZ, компилиться без ошибок, но в буфере(Reget) где должны быть данные пусто :confused:
    часть кода
    Code:
    HKEY hKey;
    RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfeaces\\{2BF69BB5-EB8E-48CE-8D1F-FA2CCF27B}", 0, KEY_READ, &hKey);
    char Reget[64];
    DWORD RegetPath = sizeof(Reget);
    DWORD type = REG_SZ;
    RegQueryValueExA(hKey, "DhcpIPAddress", NULL, &type, (PBYTE)Reget, &RegetPath);
    RegCloseKey(hKey);
    
    printf(Reget);
    
     
Thread Status:
Not open for further replies.