|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
[C] la "calloc" patisce il caldo???
Ciao a tutti...
ho un problemino stranissimo nell'allocazione di una matrice di int... ecco il codice: Codice:
... dipendenze = (int **) calloc(n_ops, sizeof(int *)); for(i = 0; i < n_ops; i++) dipendenze[i] = (int *) calloc(n_ops, sizeof(int)); ... n_ops vale 7... secondo voi, com'è possibile che la calloc allochi la memoria come se n_ops valesse solo 4????? se io, dopo aver allocato la matrice, faccio un bel "print sizeof(dipendenze)" il risultato è 4 e non 7 come dovrebbe essere... scommetto che è un errore stupido (in genere è sempre così secondo voi dove sbaglio? grazie
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
#2 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Va detto comunque che la relazione tra array e puntatori viene molto mitizzata e poco capìta. Dài un'occhiata a c-faq.com, il sito delle FAQ del newsgroup comp.lang.c, alla sezione 6.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
vabè, ma scusa....
non dovrebbe allocarmi comunque una matrice 7x7?? invece, gliela faccio stampare ed è una 4x4...
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
aggiornamento:
il ciclo lo fa 6 volte (anzichè 7) e però ne alloca solo 4... sto impazzendo... sul mio pc ho l'unica calloc in grado di decidere da sola quanto deve allocare ps: per sicurezza, ho provato anche con la malloc, ma fa la stessa cosa... il fatto è che finchè non riesco ad allocare la memoria, sono bloccato, perchè non posso debuggare...
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
#5 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Presumo che il problema sia da qualche altra parte.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
nono... non hai capito... ho forse mi sono spiegato male io
lasciando perdere sizeof, quando provo a fargliela stampare, mi stampa solo una 4x4 e infatti, se provo ad accedere alle altre caselle, mi da un Segmentation fault...
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Quote:
perchè come limite mettevo sizeof() che quindi ritornava 4... la situazione ora è questa: la memoria è allocata giusta, ma quando provo a cambiare un valore della matrice (da 0 a 1) mi da nuovamente SegFault... vi posto il codice intero, vah... Codice:
#include <stdio.h>
#include <string.h>
#define LENGTH 21
#define MAX_LENGTH 255
int **dipendenze, flag = 0, dipend = 0;
typedef struct {
char nome[LENGTH];
int tipo;
int durata;
} Operazione;
Operazione *operazioni;
void load_file(void);
void print_dip(void);
void main (void)
{
load_file();
print_dip();
}
void load_file(void) {
FILE *fp;
int n_ops, i, j, tempo_tmp, op_tmp, op1, op2;
char temp[MAX_LENGTH], nome_tmp[LENGTH], tipo_tmp[4], nome1[LENGTH], nome2[LENGTH];
fp = fopen("dati.txt", "r");
if(fp == NULL) {
printf("Unable to open dati.txt\n");
return;
}
fgets(temp, MAX_LENGTH, fp);
sscanf(temp, "%d", &n_ops);
operazioni = (Operazione *) calloc(n_ops, sizeof(Operazione));
dipendenze = (int **) calloc(n_ops, sizeof(int *));
for(i = 0; i < n_ops; i++)
dipendenze[i] = (int *) calloc(n_ops, sizeof(int));
for(i = 0; i < n_ops; i++)
for(j = 0; j < n_ops; j++)
dipendenze[i][j] = 0;
print_dip();
for(i = 0; i < n_ops; i++) {
fgets(temp, MAX_LENGTH, fp);
sscanf(temp, "%s %s %d", nome_tmp, tipo_tmp, &tempo_tmp);
op_tmp = nome_tmp[2] - '0';
strncpy(operazioni[op_tmp].nome, nome_tmp, strlen(nome_tmp));
if(!(strncmp(tipo_tmp, "AND", strlen(tipo_tmp)))) {
flag = 1;
operazioni[op_tmp].tipo = 1;
} else {
operazioni[op_tmp].tipo = 0;
}
operazioni[op_tmp].durata = tempo_tmp;
}
while(fgets(temp, MAX_LENGTH, fp)) {
sscanf(temp, "%s %s", nome1, nome2);
op1 = nome1[2] - '0';
op2 = nome2[2] - '0';
dipendenze[op1][op2] = 1;
}
fclose(fp);
}
void print_dip(void) {
int i = 0, j = 0;
for(i = 0; i < 7; i++) {
for(j = 0; j < 7; j++)
printf("%d", dipendenze[i][j]);
printf("\n");
}
}
grazie mille
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
|
#10 | |||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Se ricordo bene, una chiamata del tipo scanf("%s%s",s1,s2) continua a inserire caratteri in s1 finché non incontra un newline. Se le righe hanno la forma "parola, spazio, parola, spazio, numero, a capo" allora o scansioni una riga alla volta, la spezzi con strtok, e poi la elabori; oppure usi tab al posto di spazio come separatore e usi "%s\t%s\t%n" come stringa di formato. EDIT: ricordavo male, si ferma agli spazi Quote:
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 29-06-2006 alle 23:05. |
|||
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ciao,
alcuni suggerimenti: 1 - La matrice e' globale. Ti devi portare dietro anche le sue dimensioni, visto che la sizeof() non ti puo' aiutare (hai allocato dinamicamente). Pertanto metti n_ops allo stesso livello di visibilita', cosi' quando accedi alla matrice puoi anche accedere alle sue dimensioni; 2 - cambia il codice di allocazione con: Codice:
dipendenze = (int **) calloc(n_ops, sizeof(int *));
if (!dipendenze)
{
printf ("Errore allocazione memoria\n");
exit (0);
}
for(i = 0; i < n_ops; i++)
{
dipendenze[i] = (int *) calloc(n_ops, sizeof(int));
if (!dipendenze[i])
{
printf ("Errore allocazione della riga %d\n", i);
exit(0);
}
}
3 - cambia la void print_dip() di conseguenza: Codice:
void print_dip(void) {
int i = 0, j = 0;
for(i = 0; i < n_ops; i++) {
for(j = 0; j < n_ops; j++)
printf("%d", dipendenze[i][j]);
printf("\n");
}
4 - Prima di accedere alla matrice, controlla gli indici, che siano inferiori a n_ops. La sicurezza non e' mai troppa. Analogamente, controlla che n_ops sia > 0. 5 - Il fatto che tu abbia un crash di quel genere suggerisce davvero che gli indici siano fuori range. Puoi fare un ulteriore controllo? Spero che questi suggerimenti ti possano aiutare High Flying Sottovento
__________________
In God we trust; all others bring data |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
grazie a tutti
cmq io ho già fatto numerosi controlli... fino al punto in cui cerco di cambiare l'elemento della matrice va tutto bene (controllato con gdb), il problem asi presenta lì... il fatto è che i due indici sono nel range corretto, uno vale 4 e l'altro vale 5, mentre n_ops vale 7... EDIT: in più, pensavo che poche righe sopra, l'azzeramento della matrice me lo fa correttamente e senza problemi... quindi non è un problema di allocazione... EDIT2: se con gdb provo ad accedere a quel valore (print dipendenze[4][5]) mi dice: "Cannot access memory at address 0x15"... ma se provo ad accedere a quel valore poche righe sopra (subito dopo l'azzeramento) non ho nessun problema e mi stampa il valore giusto..
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" Ultima modifica di Gandalf_BD : 30-06-2006 alle 08:37. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
se si, puoi postare il file che carichi ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
si, il problerma c'è ancora...
ecco il file: Codice:
7 op4 AND 10 op6 OR 80 op3 OR 40 op1 OR 60 op7 AND 50 op2 AND 30 op5 OR 20 op4 op5 //qui è dove il programma da il Segmentation Fault op2 op5 op3 op7 op1 op4 op5 op7 op4 op6 op2 op4
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
il problema é questa riga: op7 AND 50
in particolare op7 praticamente quando fai Codice:
op_tmp = nome_tmp[2] - '0'; quindi Codice:
strncpy(operazioni[op_tmp].nome, nome_tmp, strlen(nome_tmp)); Ciao
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
che errore da pollo grazie mille, ma hai salvato il weekend! ![]() ps: pura curiosità... come mai il segmentation fault non me lo dava al momento dell'invasione di altra memoria?
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
#17 | |||
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
che la vede da un altro punto di vista Quote:
Quote:
cosa che faccio é spostare l'ordine delle variabili per vedere se cambia qualcosa Forse qualcuno piú esperto di me ti saprá rispondere ....
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:12.




















