Newsgroup: it.comp.lang.c
Titolo: Dimensione stack?

Salve a tutti,  sto portando un grosso progetto da AIX a Linux...ma ho
qualche situazione strana.
Utilizzando in alcune funzioni dei parametri locali di una certa dimensione
la funzione semplicemente non va, praticamente a qualunque istruzione si
pianta; riducendo la dimensione delle variabili locali tutto funziona. (non
ricevo nessun segnale su stack overflow o similari)
Utilizzo gcc 3.2.2 su un Redhat 9.
grazie


In che senso non va? qual e' il messaggio di errore? Mi interessa molto 
in quanto anch'io avro' a che fare col porting tra AIX e Linux. 
Dettaglia tutto il problema, grazie. Ciao

Sono le tipiche situazioni senza molto senso, dato che è la seconda volta
che mi succede forse c'è un qualcosa sotto.
Praticamente ho una funzione on cui dichiaro 6 strutture da 16K ciascuna,
non ricevo nessun warning ma al momento della chiamata della funzione mi dà
un segmentation fault alla prima istruzione della funzione (anche se è
un'inizializzazione). Se ne metto 4 tutto funziona.
La stessa cosa mi è capitata in un'altra funzione e sempre per delle
variabile troppo "grosse" dichiarate nella funzione. Questo mi ha fatto
pensare a quastioni dello stack, ma onestamente non saprei cosa pensare.
Forse può essere il compilatore non adatto a progetti molto grandi oppure di
una versione vecchia (come ho scritto prima uso la 3.2.2 e c'è la 4). Forse
sarebbe meglio usare un altro compilatore?
p.s. auguri.....


 p.s. auguri.....
Grazie 8-(


 ha scritto nel messaggio
news:d6s61c$pum$1...@newsfeed.cineca.it...


 E questo quando dichiaro una certa dimensione, mah!!!
E` un progetto per la NASA che non puoi farci vedere un pezzo di codice?
Non abbiamo la sfera di cristallo attiva ;-)



fugrarsi, nessun problema solo che penso esuli dal codice specifico.
Comuqnue ecco una situazione
tipica:
Questa è una funzione che ho smanacciato un pò per vedere il comportamento
in situazioni diverse:
/*---------------------------- 
bMCVWri --------------------------------------*/
    boolean                             /* status dell'elaborazione
*/
bMCVWri(                                /* SCRIVE RECORD
*/
    void *pvRec,                        /* record considerato
*/
    void *pvOld,                        /* record precedente
*/
    tCrs *pCrs
    )
/*
** Scrive un record MCV.
*/
{
    LOCAL const tFld MCVFld;            /* struttura descrittiva del file
*/
    tMCV  *pMCV;                        /* puntatore al record MCV
*/
    tMCT  MCT, MCTOld;                  /* puntatore al record MCV
*/
    boolean bDbs;                       /* flag successo DbsWri
*/
    boolean bTrn;                       /* flag transaz. aperta
*/
    boolean bCrs = FALSE;               /* flag per apertura cursore
*/
 boolean bAlloco = FALSE;   /* Se ho il tcursor Tmp allocato      */
Qua c'erano dichiarate due strutture tCrs (che sono di 16K)
    tCrs  *CrsTmp;                      /* struttura cursore temporaneo
*/
    int  iErr;                          /* tipo errore
*/
    char sErr[LEN_MSG]="";              /* descrizione errore
*/
    pMCV  = (tMCV *)pvRec;
    if(pCrs || !pvOld) bCrs = TRUE;     /* uso un mio eventuale cursore
*/
    else {
Mallocata la prima, non avevo più il problema
  CrsTmp = (tCrs *) malloc(sizeof(tCrs));
       pCrs = CrsTmp;
       (void) bDbsCrI(&MCVFld, pCrs);
  bAlloco = TRUE;
    }
    bTrn = bDbsTrn();                   /* evito inutili chiamate di
funzione */
    if(!bTrn) {                         /* se non c'e' la transazione la
apro */
       if(!bDbsPkI(lkWri, PKT_LIMIT, "bMCVWri")) goto ERR_A;
       if(pvOld && !bDbsRea(&MCVFld, pvOld, TAS_INVARIATO + TAS_BLOCCA,
NULL, pCrs, 0)) goto ERR_A;
    }
    if(bStrNul(pMCV->sMCV)) {           /* se creazione aggiorna ctr MCD
*/
Punto importante - Adesso mi da errore dopo (alla bFldRea che usa anchessa
delle dichiarazioni), se lo metto dichiarato si pianta alcune righe prima
(!!)
    tCrs  *pCrsMCT = (tCrs *) malloc(sizeof(tCrs));         /* struttura
cursore MCD              */
       CLEAR(MCT);
       CLEAR(MCTOld);
       (void) bDbsCrI(&MCTFld, pCrsMCT);
       strcpy(MCT.sMCT, pMCV->sMCT);
       (void) bFldRea(&MCTFld, TAS_RICERCA + TAS_BLOCCA, &MCT, NULL,
pCrsMCT, 0);
       MCTOld = MCT;
       MCT.ctRgV++;
       if(bStrNul(pMCV->sMCV)) sprintf(pMCV->sMCV, "%.*d", LEN_MCC-1, (int)
MCT.ctRgV);
       bDbs = bDbsWri(&MCTFld, &MCT, &MCTOld, pCrsMCT);
       vDbsCrF(pCrsMCT);
    free(pCrsMCT);
       if(!bDbs) goto ERR_A;
    }
    if(!bDbsWri(&MCVFld, pvRec, pvOld, pCrs)) goto ERR_A;
    if(!bCrs) vDbsCrF(pCrs);
    if(!bTrn) vDbsPkF();
 if (bAlloco) free(CrsTmp);
    return(TRUE);
ERR_A:
    if(!bCrs) vDbsCrF(pCrs);
    if(!bTrn) vDbsPkA();
    if(iErr) Errore(STANDARD_ERR, iErr, "bMCVWri", sErr);
 if (bAlloco) free(CrsTmp);
    return(FALSE);
}
Praticamente, se lascio le tCrs dichiarate alla prima istruzione si pianta,
se le alloco va avanti ma sposto il problema oltre a delle chiamate di
funzioni successive.

 funzioni successive.
Apparentemente non vedo alcuna ragione.  Sembra corretto. Come dichiari 
le strutture tCrs per allocarle nello stack?
Eventualmente controlla se hai limiti di memoria nel tuo sistema con:
$  ulimit -a


 wrote in message
news:Nohje.6374$
Jd....@tornado.fastwebnet.it

Non e' particolarmente furbo passare strutture di quelle dimensioni
sullo stack. Lo stack e' limitato (in generale un mega), il mio
suggerimento e' di passare dei puntatori e (se non vuoi modificare i
valori originari) farsi delle copie locali (le strutture si copiano
con l'assegnazione, non c'e' nemmeno bisogno di fare memcpy()).
Se proprio ti va di farti male, prova a dare un'occhiata a
http://groups.google.com/groups?hl=it&lr=&threadm=d84c73cb9ab9fec1fa1ed6f6ec1c1a2a.58813%40mygate.mailgate.org&rnum=1&prev=/groups%3Fq%3Dstack%2Bgcc%2Bauthor:paolitto%26hl%3Dit%26lr%3D%26selm%3Dd84c73cb9ab9fec1fa1ed6f6ec1c1a2a.58813%2540mygate.mailgate.org%26rnum%3D1
e vedi se ti e' utile.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 con l'assegnazione, non c'e' nemmeno bisogno di fare memcpy()).
Si, nel limite del possibile si passano i puntatori, ma se poi dici che 
si possono copiare devi pur allocare l'area :-)


 ha scritto nel messaggio
news:d71lld$56q$1...@marina.home.net.it...
