|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2008
Città: Brindisi
Messaggi: 20
|
[C/C++]Allocazione Dinamica Matrice
Salve a tutti... ho un noiosissimo problema di funzionamento con una matrice allocata dinamicamente... il problema è che ho una matrice in cui inizialmente è allocata solo una riga (o una colonna, come volete voi
![]() Il programma prende una stringa da XML, comunque la riporto come se fosse inizializzata all'inizio. Vi riporto il codice incriminato: Codice HTML:
#include <string.h> #include <stdlib.h> #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { int i1, i2, j1, j2; //indici per calcolare gli intervalli j2 = 0; int **seqLati; //vettore contenente la sequenza - 4 per motivi pratici seqLati = (int**)calloc(1, sizeof(int*)); seqLati[0] = (int*)calloc(4,sizeof(int)); string coordinatefield="1 21 22 , 2 22 23 , 3 23 24 , 4 24 25 , 5 25 26 , 6 26 27 , 7 27 28 , 8 28 29 , 9 29 30 , 10 30 31 , 11 31 32 , 12 32 33 , 13 33 34 , 14 34 35 , 15 35 36 , 16 36 37 , 17 37 38 , 18 38 39 , 19 39 40 , 20 40 41 , 22 42 43 , 23 43 44 , 24 44 45 , 25 45 46 , 26 46 47 , 27 47 48 , 28 48 49 , 29 49 50 , 30 50 51 , 31 51 52 , 32 52 53 , 33 53 54 , 34 54 55 , 35 55 56 , 36 56 57 , 37 57 58 , 38 58 59 , 39 59 60 , 40 60 61 , "; string temp; string temp2; //Load sequenza triangoli int i = 0; int j = 0; for(i1 = 0; i1 < coordinatefield.size();) { i2 = coordinatefield.find(",",i1); temp = coordinatefield.substr(i1,i2-i1); i1 = i2+1; j2 = 0; for(j1 = 0; j1 < temp.size();){ j = 0; while(j2 != -1){ if(temp.find(" ",j1)== NULL) j1++; else { float x; j2 = temp.find(" ",j1); temp2 = temp.substr(j1, j2-j1); x = atof(temp2.c_str()); seqLati[i][j]= (int)x; cout << seqLati[i][j] << endl; j++; j1 = j2+1; } if (j2 == -1) j1 = temp.size(); } i++; seqLati[i] = (int *)realloc(seqLati, 4*sizeof(int)); if ( seqLati[i] == NULL ) cout << ( "Memoria disponibile insufficiente\n" ); cout << "Reallocato" << endl; } cout << seqLati[1][0] <<" e " <<seqLati[1][1]<<" e " << seqLati[1][2] << endl; } return 0; } Il programma deve trasformare i punti elencati in quel modo nella stringa, in una matrice di punti, con i vettori monodimensionali composti dai 3 vertici. La gestione del parsing spiega il caos dentro il for, visto che dovrei ignorare tutte le possibili situazioni "fastidiose" causate da più spazi bianchi... La cosa che mi stupisce è che programma si blocca dopo aver letto correttamente i primi punti...!! ![]() Ci sto sbattendo la testa da un bel po', senza trovare alcuna soluzione... grazie mille a chi mi vorrà aiutare!!!!!!!!!!!!!!!!!! Ultima modifica di d0c1Le.Killah : 25-08-2008 alle 00:06. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Il parsing magari poteva essere leggermente diverso per essere più leggibile, ma comunque...
Codice:
seqLati[i] = (int *)realloc(seqLati, 4*sizeof(int)); ![]() Rivedi la riga e riprova... In più c'è un "coordinatefield.size()" nel for che dovrebbe invece essere coordinatefield.length() (lo stesso per il temp del ciclo annidato e così via). Usi una chiamata ad atof() quando una atoi() era ben più indicata (sono tutti numeri interi, perché vai a leggere un numero in virgola mobile?), e dai per scontato che la ricerca di uno spazio a partire dalla posizione temp abbia successo (e se invece è l'ultimo numero nella stringa e poi la stringa termina?).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
La classe string ha sia il metodo size che quello length, i quali fanno la stessa cosa.
Cmq, perché non usi new invece dei vari alloc? Inoltre, il metodo find quando non trova la stringa restituisce string::npos, (considerato anche -1) ma tu lo confronti con NULL che equivale a 0, ma forse la tua intenzione e' quella di verificare se lo spazio ci sia o no. Ciao |
![]() |
![]() |
![]() |
#4 |
Junior Member
Iscritto dal: Jun 2008
Città: Brindisi
Messaggi: 20
|
Ciao ragazzi, grazie per la risposta... Daniele, grazie per la critica, ma size va benissimo, atof subisce casting perchè all'inizio erano float e ho fatto tutto al volo (comunque sì, lo correggo). Infine, le stringhe finiscono con " ," in quanto generate da tool di exporting.
Il while mi serve per terminare appunto quando i 3 punti sono letti, mentre il confronto con il NULL riguarda gli spazi. Va detto che all'inizio usavo vettori statici e funzionava alla perfezione... quindi il problema potrebbe riguardare qualche indirizzamento che non riesco a trovare... La riga: Codice HTML:
seqLati[i] = (int *)realloc(seqLati, 4*sizeof(int)); P.S.:Sì, uso malloc ormai per principio, perchè voglio capire dove sta l'errore, poi magari lo converto in new e delete... Grazie! |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Vero, errore mio. Anche se length() è un nome migliore, IMHO.
![]() Quote:
Se devi usare realloc() non mischiare le cose e a tal punto metti anche la calloc().
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Dimenticavo, prima, oltre al fatto che realloc() non alloca ogni volta nuovi spazi (e quindi devi dirgli tu ogni volta la dimensione totale cercata), stai anche riallocando seqLati e assegni il tutto a seqLati[i], stai introducendo un memory leak.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 25-08-2008 alle 11:06. |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Credo sia:
Codice:
seqLati[i] = (int *)calloc(4*sizeof(int)); Ciao |
![]() |
![]() |
![]() |
#8 |
Junior Member
Iscritto dal: Jun 2008
Città: Brindisi
Messaggi: 20
|
Ciao.
Anche scrivendo Codice HTML:
seqLati[i] = (int *)calloc(4*sizeof(int)); |
![]() |
![]() |
![]() |
#9 |
Junior Member
Iscritto dal: Jun 2008
Città: Brindisi
Messaggi: 20
|
Ciò che mi lascia completamente inerme, è che ho il seguente output (ho sostituito la realloc con la calloc, seguendo il precedente consiglio):
Codice:
1 21 22 0 Reallocato 0 e 0 e 0 2 22 23 0 Reallocato 0 e 0 e 0 3 23 24 0 Reallocato 0 e 0 e 0 4 24 25 0 Reallocato 0 e 0 e 0 5 25 26 0 Reallocato 0 e 0 e 0 6 26 27 0 Reallocato 0 e 0 e 0 7 27 28 0 Reallocato 0 e 0 e 0 8 28 29 0 Reallocato 0 e 0 e 0 9 29 30 0 Reallocato 0 e 0 e 01 10 30 31 Reallocato Dopo un po' va in crash, sebbene sia riuscito comunque ad allocare la memoria... Se qualcuno volesse gentilmente testare il codice, per farlo funzionare basta dichiarare insieme alla matrice: Codice:
int i1, i2, j1, j2; //indici per calcolare gli intervalli j2 = 0; |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
prova a commentare le righe in cui appare seqLati, precisamente:
Codice:
seqLati[i][j]= (int)x; cout << seqLati[i][j] << endl; seqLati[i] = (int *)realloc(seqLati, 4*sizeof(int)); if ( seqLati[i] == NULL ) Ho provato a tracciare l'output come te e si blocca dopo aver letto l'ultimo. Ultima modifica di Noixe : 25-08-2008 alle 13:19. |
![]() |
![]() |
![]() |
#11 |
Junior Member
Iscritto dal: Jun 2008
Città: Brindisi
Messaggi: 20
|
Ciao a tutti...
ho risolto! In pratica sbagliavo l'allocazione dinamica... forse il codice sarà più esplicativo: Codice:
int i = 0; int j = 0; for(i1 = 0; i1 < coordinatefield.size();) { i2 = coordinatefield.find(",",i1); temp = coordinatefield.substr(i1,i2-i1); i1 = i2+1; j2 = 0; for(j1 = 0; j1 < temp.size();){ j = 0; while(j2 != -1){ if(temp.find(" ",j1)== NULL) j1++; else { float x; j2 = temp.find(" ",j1); temp2 = temp.substr(j1, j2-j1); x = atoi(temp2.c_str()); seqLati[i][j]= x; //cout << seqLati[i][j] << endl; j++; j1 = j2+1; } if (j2 == -1) j1 = temp.size(); } } i++; seqLati = (int**)realloc(seqLati,(i+1)*sizeof(int*)); seqLati[i] = (int *)calloc(4,sizeof(int)); if ( seqLati[i] == NULL ) cout << ( "Memoria disponibile insufficiente\n" ); cout << "Reallocato" << endl; } Era il mio primo post qui. Vorrei ringraziarvi in quanto ho subito trovato un sacco di gente pronta ad aiutarmi... ![]() |
![]() |
![]() |
![]() |
#12 | |||
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]() Quote:
![]() Quote:
![]() Magari puoi aggirarlo: Codice:
void *pTemp; pTemp = (void *) realloc(pMatrice, n * sizeof(T)); if (pTemp == NULL) { printf("Errore\n"); free(pMatrice); exit(EXIT_FAILURE); } pMatrice = pTemp;
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|||
![]() |
![]() |
![]() |
#13 |
Junior Member
Iscritto dal: Jun 2008
Città: Brindisi
Messaggi: 20
|
Grazie per i consigli..
per carità, purtroppo a scovare i problemi di persona ci sono abituato, semplicemente non avevo mai avuto la necessità di fare quest'operazione e le guide che ho trovato comunque ricavavano la dimensione all'inizio, cosa che io non potevo e volevo fare... per questo ho deciso di postare... in ogni caso grazie ancora!!! ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:50.