Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    consiglio urgente: problemi con calloc() in C

    ciao a tutti,

    sono un bioinformatico e sto finendo un prog in C (mi serve veloce per il genoma!), ma a parte il resto del codice che funzia ho un problema con la gestione della memoria con calloc() (e anche malloc()... che ho provato ma da lo stesso problema).
    mi spiego:
    ho il seguente framm di codice (premetto che ho dich: char *x_1):

    i=0;
    while (i <= 26)
    {
    x_1 = (char *) calloc(Cl[i], sizeof(char)); // 1) 1 qui da errore
    i++;
    count=0;
    CoC_tot=0;
    CoS_tot=0;
    Com_tot=0;
    for(; {
    x_1 = (char *) calloc(Cl[i], sizeof(char)); // 2) anche qui da errore
    if (fgets(b,200,fp4) == NULL) {
    break;
    }
    sscanf(b,"%d %d %d %d %d %f %f %f %d %d\n",&C, &Start, &End, &Len, &Span, &cos, &com, &coc, &in1, &in2);
    if (C==i) {
    count++;
    x_1 = (char *) calloc(Cl[i], sizeof(char)); //// qui è OK!!!
    printf("ecco che inizio a caricare %d",x_1);
    printf("K:%d e i:%d e C:%d e Cl[%d]:%d\n",k,i,C,i,Cl[i]);
    for (k=0; k <= Cl[i]; k++) {
    x_1[k]='_';
    }
    ....

    la mia calloc() funziona nell'IF annidato if C==i, ma non appena la tiro fuori e la metto in pos 1) o 2) -vi allego il framm di codice sopra, con i numeri- gcc compila bene ma in esecuzione il prog mi da il seguente errore:

    a.out(263) malloc: *** vm_allocate(size=191275008) failed (error code=3)
    a.out(263) malloc: *** error: can't allocate region
    a.out(263) malloc: *** set a breakpoint in szone_error to debug

    che poi, nel file specifico di log Logs/CrashReporter/a.out.crash.log è:

    Exception: EXC_BAD_ACCESS (0x0001)
    Codes: KERN_PROTECTION_FAILURE (0x0002) at 0x00000000

    Thread 0 Crashed:
    0 a.out 0x00003424 riepilogo + 448 (crt.c:355)
    1 a.out 0x00002ea4 main + 1948 (crt.c:355)
    2 a.out 0x00001f54 _start + 348 (crt.c:272)
    3 a.out 0x00001df4 start + 60

    Thread 0 crashed with PPC Thread State:
    srr0: 0x00003424 srr1: 0x0000f030 vrsave: 0x00000000
    cr: 0x24000224 xer: 0x00000004 lr: 0x00003404 ctr: 0x90013880
    r0: 0x0000005f r1: 0xbffff850 r2: 0x00000000 r3: 0x0000002c
    r4: 0x00000000 r5: 0x00000048 r6: 0x0000000a r7: 0x00000048
    r8: 0x00000889 r9: 0x00000000 r10: 0x00003f0b r11: 0x84000282
    r12: 0x90013880 r13: 0x00000000 r14: 0x00000000 r15: 0x00000000
    r16: 0x00000000 r17: 0x00000000 r18: 0x00000000 r19: 0x00000000
    r20: 0x00000000 r21: 0x00000000 r22: 0x00000000 r23: 0x00000000
    r24: 0x00000000 r25: 0x00000000 r26: 0xbffffcd4 r27: 0x3ff00000
    r28: 0xbffff8e8 r29: 0xbffff8dc r30: 0xbffff850 r31: 0x0000327c

    Binary Images Description:
    0x1000 - 0x3fff a.out /Users/Ele/Ese_prog_C/a.out
    0x8fe00000 - 0x8fe50fff dyld 43 /usr/lib/dyld
    0x90000000 - 0x901a6fff libSystem.B.dylib /usr/lib/libSystem.B.dylib
    0x901fe000 - 0x90202fff libmathCommon.A.dylib /usr/lib/system/libmathCommon.A.dylib
    0x91d33000 - 0x91d53fff libmx.A.dylib /usr/lib/libmx.A.dylib

    ho provato e riprovato ma nulla!!! ho perfino provato ad allocare un vettore definito lì, ma nulla!
    io ho bisogno che quel vettore si riazzerei FUORI dall'IF, e non dentro...
    mi aiutate per favore????

    grazie ,e a buon rendere.
    dani

  2. #2
    Non ho letto approfonditamente il codice ma se ti da
    codice:
    vm_allocate(size=191275008) failed (error code=3)
    credo che tu abbia cercato di allocare 191275008 bytes che sono circa 190MB
    In effetti quello che non so è: che valore assume Cl[i], che è la dimensione che cerchi di allocare ? temo che non inizializzi i valori di Cl[i].
    Inoltre controllerei memory leak; se fai
    codice:
     x_1 = (char *) calloc(Cl[i], sizeof(char)); // 1)
    e poi in un for fai senza fare una free:
    codice:
     x_1 = (char *) calloc(Cl[i], sizeof(char)); // 2) anche qui da errore
    in pratica hai creato una fabbrica di memory leak Ricordati che la memoria che ottieni con calloc la devi liberare con free.

  3. #3

    risolto!

    ciao fastcoder,

    innanzitutto grazie!
    in effetti la fabbrica di memoria c'è e mi serve pure! E' che si tratta di lavorare con dei cromosomi (dunque lunghezze dell'ordine di 140 milioni di elementi e più...).
    tuttavia ho risolto inserendo una fncina mem,un controllo sull'allocazione (evidentemente nn gli piaceva, senza) e un free() piazzato al punto giusto (prima di rifare il ciclo for). ora funzia:

    se può esserti/esservi d'aiuto, ecco il codice:

    i=0;
    while(i < 26)
    {
    i++; int mem=0;
    count=0;
    CoC_tot=0;
    CoS_tot=0;
    Com_tot=0;
    mem=Cl[i]*sizeof(char);
    printf("Trying to alloc %ld bytes...\n",mem);
    if((x_1=(char *)malloc(mem))==NULL){printf("Error allocating memory\n");exit(0);}
    printf("alloc() ok.\n");
    printf("ecco che inizio a caricare... %d\n",x_1);
    for (k=0; k <= Cl[i]; k++) {
    x_1[k]='_';
    }
    for(; {

    if (fgets(b,200,fp4)==NULL){break;}
    sscanf(b,"%d %d %d %d %d %f %f %f %d %d\n",
    &C, &Start, &End, &Len, &Span, &cos, &com, &coc, &in1, &in2);
    printf("\t\tC %d e i %d:\n",C,i);
    if (C==i) {
    count++;
    printf("\t\tC %d e i %d e count:%d\n",C,i,count);
    printf ("\tstart + end: %d %d \n",Start,End);
    for (l=Start; l <= End; l++) {
    x_1[l]='*';
    ecc eccc.....

    grazie ancora e a presto!
    dan

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.