Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633

    [C] programma semplicissimo -> problemi enormi!!!

    Salve a tutti,
    sto cercando di capire se sbaglio qualcosa io o il compilatore non va...uso Dev-C++ 4 (ho provato la versione successiva...ma mi sono trovato meglio con questo).
    questo è il codice:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    char *nome;
    int main()
    {
    nome = "conca..";
    strcat(nome,"..teno");
    printf("\n%s",nome);
    getch();
    return 0;
    }

    la compilazione è ok, ma quando lo lancio, mi compare la finestrella che interrompe l'eseguibile, dicendo che ha riscontrato degli errori.
    Uso WinXp.

    Cosa ancor più strana: mi compila bene anche se elimino le inclusioni delle librerie...perchè? (ovviamente poi non funziona)

    Ho concluso che il problema sta su strcat, perchè se tolgo quello è tutto ok...però a me serve!!!
    che devo fare?
    scusate se mi sono dilungato, ma non sapevo da che parte iniziare per spiegarmi...
    qualcuno mi aiuti!!!
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  2. #2
    codice:
    #include <stdio.h> 
    #include <string.h> 
    
    char nome[]="conca"; 
    int main() 
    { 
        strcat(nome,"teno"); 
        printf("\n%s",nome); 
        getchar(); 
        return 0; 
    }
    P.S: riguardati meglio i puntatori (cosa sono e a cosa possono puntare)
    ...Terrible warlords, good warlords, and an english song

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633

    giusto!

    accidenti...sono proprio arrugginito...

    il nome di un vettore è sinonimo dell'indirizzo del suo PRIMO elemento, per cui:

    int vettore[10];
    int *puntatore;

    puntatore = &vettore[0];

    è equivalente a:

    puntatore = vettore

    mentre io confondevo il nome del vettore con l'intero vettore!!
    grazie mille!
    ciao
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  4. #4
    ehm, vero, ma li il problema e' un altro:
    il puntatore punta ad una locazione indefinita della memoria. QUando tu vai ad allocarci qualcosa, e' possibile che il programma tenti di sovrascrivere un dato gia presente, ed utilizzato, nella memoria, quindi il sistema operativo lo blocca.
    Ciao
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    Originariamente inviato da akiross
    ehm, vero, ma li il problema e' un altro:
    il puntatore punta ad una locazione indefinita della memoria. QUando tu vai ad allocarci qualcosa, e' possibile che il programma tenti di sovrascrivere un dato gia presente, ed utilizzato, nella memoria, quindi il sistema operativo lo blocca.
    Ciao
    ancora meglio!
    una domanda: se io devo modificare una stringa quindi, devo utilizzare gli array, giusto?
    ma come faccio ad inizializzare una stringa (di questo tipo) contenuta in una struttura? questo è sbagliato:

    typedef struct listaCollegata{
    struct listaCollegata *pt;
    char nome[]="una stringa";
    }lista_posizioni;

    x i moderatori: mi scuso se ho postato in più 3d lo stesso argomento
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  6. #6
    codice:
    char nome[]="una stringa";
    non puoi assegnare dei valori ai MEMBRI di una struttura
    in fase di DEFINIZIONE della strutura stessa
    (in quanto non è stata ancora definita alcuna variabile).

    codice:
    struct struttura{
        char cognome[15];
        char nome[15];
    };
    
    void main(){
        struct struttura utente; //<-- ora definisco una variabile (o istanza) alla struttura
        printf("inserisci cognome: ");
        gets(utente.cognome); //<-- ora posso assegnare un valore al campo-struttura cognome
        printf("inserisci nome: ");
        gets(utente.nome);
        printf("%s %s\n",utente.cognome, utente.nome);
    }
    ...Terrible warlords, good warlords, and an english song

  7. #7
    devi usare la memoria dinamica o sfruttare la nuova feature del C ISO C99 che ti permette di creare array sullo stack con indice dinamico. Il seguente esempio:

    #include <stdio.h>
    #include <string.h>

    char nome[]="conca";
    int main()
    {
    strcat(nome,"teno");
    printf("\n%s",nome);
    getchar();
    return 0;
    }

    è sbagliato perchè non vi è spazio sufficiente sulla stringa per inserire "teno" e se non crasha e per puro caso (puoi fare una prova con un nome più lungo, tipo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA").
    Il modo corretto è calcolarsi prima la lunghezza della prima stringa, poi quella della seconda, aggiungere 1 per lo zero finale e infine fare lo strcat.
    Quindi se vuoi unire due stringhe devi fare cosi:

    void f(const char *str1, const char *str2)
    {
    char strf[strlen(str1) + strlen(str2) + 1];

    strcpy(strf, str1);
    strcat(strf, str2);
    }
    o usando la memoria dinamica:

    void f(const char* str1, const char *str2)
    {
    char *strf;
    strf = (char*)calloc(strlen(str1) + strlen(str2) + 1, sizeof(char));
    strcpy(strf, str1);
    strcat(strf, str2);

    }

    Sinceramente la prima è più veloce (le operazioni sullo stack sono sempre più veloci) ma la prima è più efficiente (puoi ritornatla anche come stringa per altre funzioni). A te la scelta.
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    mmm...ok, adesso mi fila di più...
    ora dovrei fare qualche prova (per capire meglio), xò mi sembra che entrambe le funzioni che mi hai proposto non mi ritornano la stringa concatenata...forse la seconda me lo può permettere giusto?

    Sinceramente la prima è più veloce (le operazioni sullo stack sono sempre più veloci) ma la prima è più efficiente (puoi ritornatla anche come stringa per altre funzioni). A te la scelta.
    la prima è più veloce (perchè alloca sullo stack)
    la seconda è più efficiente perchè permette di ritornare la stringa
    giusto?
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  9. #9
    :quote: In effetti bisogna ammettere che l'affermazione di
    The Great World è ESATTA

    un altro esempio esatto potrebbe essere questo:
    codice:
    #include <stdio.h> 
    #include <string.h> 
    
    int main() 
    { 
        char strA[]="stringa1", strB[]="stringa2", strC[17]="\0";  // 17 = "stringa1" + "stringa2" + '\0'  
        strcat(strC, strA);
        strcat(strC, strB);
        printf("\n%s",strC); 
        getchar(); 
        return 0; 
    }
    ...Terrible warlords, good warlords, and an english song

  10. #10
    si giusto, sorry per il lapsus. Sul forum trovi un altro topic su cui ho postato prp sull'argomento ritornare una stringa da una funzione. Non ricordo precisamente quale sia, fai una piccola ricerca.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

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.