Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2006, 18:29   #1
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
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));
...
ora... ho controllato con gdb che il valore di n_ops fosse giusto, e così è...
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ì ), ma non riesco proprio a vederlo...

secondo voi dove sbaglio?

grazie
__________________
Gandalf_BD
--------------------------------------------
"When you aim at perfection, you discover it's a moving target"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 18:40   #2
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da Gandalf_BD
se io, dopo aver allocato la matrice, faccio un bel "print sizeof(dipendenze)" il risultato è 4 e non 7 come dovrebbe essere
Il risultato è 4, ossia presumibilmente la lunghezza in byte di una parola di memoria: come deve essere dal momento che dipendenze è un puntatore e non un array.

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" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 19:38   #3
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
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"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 21:02   #4
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
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"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 21:04   #5
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da Gandalf_BD
non dovrebbe allocarmi comunque una matrice 7x7?
La matrice allocata è 7x7: solo che non è sizeof(dimensione) che te lo può dire, perché dimensione è una variabile di tipo puntatore, quindi sizeof(dimensione) è lo stesso che sizeof(void*), e non ha niente a che vedere con la memoria effettivamente allocata.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 21:05   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Gandalf_BD
Codice:
...
dipendenze = (int **) calloc(n_ops, sizeof(int *));
for(i = 0; i < n_ops; i++)
  dipendenze[i] = (int *) calloc(n_ops, sizeof(int));
...
secondo voi dove sbaglio?
Il pezzo di codice che hai postato è corretto. Se n_ops in quel momento vale 7, deve per forza allocare una matrice di int di 7x7.
Presumo che il problema sia da qualche altra parte.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 21:07   #7
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
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"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 21:07   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Gandalf_BD
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...
Puoi postare il codice che stampa la matrice??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 21:18   #9
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
Iscritto dal: Jun 2004
Messaggi: 760
Quote:
Originariamente inviato da andbin
Puoi postare il codice che stampa la matrice??
no... ehm... quello era sbagliato
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");
  }
}
al momento del SefFault op1 e op2 valgono rispettivamente 4 e 5, per cui non dovrebbero esserci problemi... la riga incriminata è "dipendenze[op1][op2] = 1;"

grazie mille
__________________
Gandalf_BD
--------------------------------------------
"When you aim at perfection, you discover it's a moving target"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 22:00   #10
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da Gandalf_BD
Codice:
    sscanf(temp, "%s %s %d", nome_tmp, tipo_tmp, &tempo_tmp);
Com'è formattato il tuo file di dati?
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:
Codice:
    op_tmp = nome_tmp[2] - '0';
Questo restituisce il valore del numero rappresentato dal carattere nome_tmp[2], a condizione che i caratteri delle dieci cifre siano consecutivi: il che avviene in ASCII ma non in EBCDIC.
Quote:
Codice:
  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);
}
Stessa osservazione di poco fa: a questo punto, i valori di op1 e op2 potrebbero non essere interi fra 0 e 9.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
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 22:05.
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 03:52   #11
sottovento
Senior Member
 
L'Avatar di sottovento
 
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);
    }
  }
In questo modo ti puoi accorgere se una delle linee non e' stata allocata correttamente.

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");
  }
Una volta fatte queste operazioni, hai qualche chance in piu' di capire cosa succede nel tuo programma.

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
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 07:10   #12
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
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 07:37.
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 07:35   #13
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Gandalf_BD
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...
ma il problema c'e' ancora ?
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 07:40   #14
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
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
grazie mille a tutti... siete disponibilissimi!
__________________
Gandalf_BD
--------------------------------------------
"When you aim at perfection, you discover it's a moving target"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 08:39   #15
trallallero
Senior Member
 
L'Avatar di trallallero
 
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';
corrisponde a op_tmp = 7
quindi
Codice:
   strncpy(operazioni[op_tmp].nome, nome_tmp, strlen(nome_tmp));
sfora l'array di Operazioni il che compromette tutta la memoria successiva
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 08:50   #16
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
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"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 09:02   #17
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Gandalf_BD


che errore da pollo
sono quelli gli errori peggiori ed é proprio li che serve un altro occhio
che la vede da un altro punto di vista

Quote:
Originariamente inviato da Gandalf_BD
grazie mille, ma hai salvato il weekend!
prima o poi anche tu mi servirai a qualcosa

Quote:
Originariamente inviato da Gandalf_BD
ps: pura curiosità... come mai il segmentation fault non me lo dava al momento dell'invasione di altra memoria?
non lo so. So solo che quando succedono 'ste cose la prima
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
GeForce NOW: ecco tutte le novità in arr...
Il Realme 16 5G debutta sul mercato glob...
HONOR svela tre nuovi tablet: il più int...
Tineco Floor One S9 Master: aspira e pul...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
I coupon nascosti di Amazon si rinnovano...
Disponibili i video e le immagini in alt...
La NASA ha rilasciato le prime fotografi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v