c ++ - C Programmering Fejlsøgningsfejl

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg laver C lektier og forsøger at få dette program til at køre, men jeg får det her:


http://i.imgur.com/UUdLB.png


Kan nogen venligst køre dette og se, om du får det samme? (Skift output katalog for tekstfiler)


Jeg har prøvet i lang tid og kan bare ikke gøre det:


Her er koden:


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

/////////////////
#define SIZE 2
/////////////////

struct Stock
{
    char name[10];
    int numShares;
    float buyShare,currPrice,fees;
    float initCost,currCost,profit;
};

/* Load the data from the keyboard and calculates 
the Initial Cost, Current Cost, and Profit 
for each stock via an array */

void load(struct Stock s[], int n) 
{
    char nameCompare[30] = "Open the bay doors";
    int i;
    for(i=0;i<n;i++)
    {
        printf("Enter the Stock Name
");
        printf(">");
        gets(s[i].name);

        /////////////////////////////////////
        if(strncmp (s[i].name,nameCompare,10) == 0)
        {
            printf("	I'm sorry, Dave, I'm afraid I can't do that
");
            Sleep(3000);
            exit(1);
        }

        /////////////////////////////////////
        printf("Enter the Number of Shares
");
        printf(">");
        scanf("\%d", &s[i].numShares);
        printf("Enter the Buying Price Per Share
");
        printf(">");
        scanf("\%f", &s[i].buyShare);
        printf("Enter the Current Price Per Share
");
        printf(">");
        scanf("\%f", &s[i].currPrice);
        printf("Enter the Yearly Fees
");
        printf(">");
        scanf("\%f", &s[i].fees);

        s[i].initCost = (float)s[i].numShares * s[i].buyShare;
        s[i].currCost = (float)s[i].numShares * s[i].currPrice;
        s[i].profit = s[i].currCost - s[i].initCost - s[i].fees;
        fflush(stdin);
    }
}

/* Sort the array of structures 
on stock name and print the array 
after the sort is completed */

void sort(struct Stock s[], int n)
{
    Stock t;
    for(int i=0;i<n-1;i++)
        for(int j=0;j<n-1;j++)
            if(strcmp(s[j].name, s[j+1].name)>0)
            {
                t=s[j];
                s[j]=s[j+1];
                s[j+1]=t;
            }
}

/* Calculate and print the total profit for all of the stocks. 
That is, find the sum of the 5 profits for each stock. In 
addition, find and print out the number of stocks that 
had a positive profit, the number of stocks that had a 
negative profit, and the number of stocks that broke 
even, that is had a profit of $0.00 */

void calc(struct Stock s[],int n)
{
    float total=0;

    int Pos=0;
    int Neg=0;
    int Even=0;

    for(int i=0;i<n;i++)
    {
        total +=s[i].profit;
        if (s[i].profit>0)
            ++Pos;
        else if (s[i].profit<0)
            ++Neg;
        else
            ++Even;
    }

    printf("
");
    printf("\%d of stocks broke Positive
",Pos);
    printf("	\%d of stocks broke Negative
",Neg);
    printf("		\%d of stocks broke Even
",Even);
    printf("
");
    printf("The Total Trofit is $\%f
", total); //Check output
    printf("
");
}
//Output of the calc function
void print(struct Stock s[], int n)
{
    for(int i=0;i<n;i++)
    {
        printf("
");
        printf("The stock is \%s
", s[i].name);
        printf("	With Initial cost of $\%0.2f
", s[i].initCost);
        printf("		Current cost is $\%0.2f
", s[i].currCost);
        printf("			And your Profit is $\%0.2f
", s[i].profit); //Check output
        printf("
");
    }
}
//Save the array of structures to a text file.
void savetext(struct Stock s[], int n)
{
    FILE *f;
    f = fopen("c:\cs36\textfile.txt","w"); 
    int i;
    for(i=0;i<n;i++)
    {
        fprintf(f,"\%s
",s[i].name);
        fprintf(f,"\%d  \%f  \%f  \%f  \%f  \%f  \%f
", s[i].numShares, s[i].buyShare, s[i].currPrice, s[i].fees, s[i].initCost, s[i].currCost, s[i].profit);
    }
    fclose(f);
}
//Retrieve and print the text file.
void loadtext(struct Stock s[], int n)
{
    FILE *f;
    f = fopen("c:\cs36\textfile.txt","r");
    for(int i=0;i<n;i++)
    {
        fgets(s[i].name, sizeof(s[i].name), f);
        fscanf(f, "\%d\%f\%f\%f\%f\%f\%f
", &s[i].numShares, &s[i].buyShare, &s[i].currPrice, &s[i].fees, &s[i].initCost, &s[i].currCost, &s[i].profit);
    }
    fclose(f);
}
//Save the array of structures to a binary file.
void savebin(struct Stock s[], int n)
{
    FILE *f;
    f = fopen("c:\cs36\binfile.bin","wb");
    if(! f)
    { 
        printf("Could not open the file");
        exit(1); 
    }
    else
        fwrite(&s, sizeof(s[10]), n, f);
    fclose(f);
}
//Retrieve and print the binary file.
void loadbin(struct Stock s[], int n)
{
    FILE *f;
    f = fopen("c:\cs36\binfile.bin","rb");
    if (! f)
    { 
        printf("Could not open the file");
        exit(1); 
    }
    else
        fread(&s, sizeof(s[10]), n, f);
    fclose(f);
}

int main (void)
{
    printf("Hello, Dave
");
    Stock s[SIZE];
    load (s, SIZE);
    sort (s, SIZE);
    savetext (s, SIZE);
    savebin (s, SIZE);
    print (s, SIZE);
    calc (s, SIZE);
    loadtext (s, SIZE);
    print (s, SIZE);
    loadbin (s, SIZE);
    print (s, SIZE);
    system("PAUSE");
}


Dette er C, ved hjælp af Visual C ++ 2008 Express

Bedste reference


Du forsøger at få adgang til null pointer.So at det vil smide denne fejl.


    fprintf(f,"\%s
",s[i].name);


I denne linje kan s [[i]] være null for nogle tilfælde i dit program, så du forsøger at få adgang til medlemsvariablen i objektet, som er NULL.


Så det kaster kun denne runtime fejl.

Andre referencer 1


Du har sendt en NULL peger et sted i et opkald til printf. Det er mest sandsynligt formatstrengen eller et strengargument (\%s).


Tryk på debug-knappen, og den visuelle debugger vil vise dig præcist, hvor i din kode det defekte opkald stammer fra.

Andre referencer 2


Jeg bemærkede fire hovedproblemer:



  • du blander scanf og gets. gets i særdeleshed er en pit, fordi den vil overskrive buffere uden anger. Generelt er det bedst at vælge den ene eller den anden. Jeg har fundet ud af, at det mest pålidelige er at bruge fgets til at scanne hver linje i en statisk buffer og analysere derfra.

  • du ringer fflush(stdin). Mens strømspyling er veldefineret for udgangsstrømme, er det ikke for input, sandsynligvis er linjen ikke, hvad du forventer.

  • du kompilerer c med en c ++ compiler. Som følge heraf har du lavet kode, der ikke passer rigtigt ind overalt. Specifikt forkortes du struct Stock til Stock, men aldrig typedef struct Stock Stock; Du bruger også C + + og C99-stil for loops, som ikke er for stor en aftale, men gcc (Linux-kompilatoren) vil klage, indtil du giver den nogle flag.



Og coup de gras! Du læser og skriver nu dine binære filer som sådan:


 fwrite(&s, sizeof(s[10]), n, f);
 fread(&s, sizeof(s[10]), n, f);


Problemet er, at et array passerer som en parameter til en funktion, behandles som en peger, snarere end en matrix. Således gav &s dig placeringen af ​​markøren i stedet for adressen til arrayet. fread smadrede derefter din stack med indholdet af den binære fil. Ændring af disse linjer til


fwrite(s, sizeof(*s), n, f); 
fread(s, sizeof(*s), n, f);


løser det store problem.


Når du arbejder med arrays, finder du sjældent dig selv at tage deres adresse, fordi de henfald til en peger til deres første element alligevel.