2 svar
80 visningar
mattegeni2000 behöver inte mer hjälp
mattegeni2000 154
Postad: 18 dec 2022 01:48

Vad är felet på mitt program

Hej, jag har svårt att leta efter vad som är fel med min kod. Jag har inte fått något fel- eller varningsmeddelande som talar om för mig vad felet är och jag undrar om någon av er kan hjälpa mig.

Sättet som programmet ska köras på är att om jag har gjort allt korrekt ska följande skrivas ut "Department of Redundancy Department" på skärmen. Men när jag kör programmet står det bara:

Memory is allocated
Memory is allocated
Assertion failed: source != NULL

och jag får också ett felsökningsfel på skärmen. Jag använder Microsoft Visual Studio. Här är min kod

 #include "dstring.h"
    #include <string.h>
    #include <stdlib.h>
    #include <assert.h>
    
    
    
    DString dstring_initialize(const char* str)
    {
        assert(str != NULL);
    
        str=(char*)malloc(sizeof(char));
        if (str == NULL) {
            
            printf("Memmory cannot be allocated\n");
        }
        else
        {
            printf("Memmory is allocated\n");
        
        } free(str);
    
    
        return NULL; 
    }
    
    int dstring_concatenate(DString* destination, DString source)
    {
        int size = 0;
        int temp = 0;
    
        assert(destination != NULL);
        assert(source != NULL);
        assert(*destination != NULL);
    
        size = strlen(*destination) + strlen(source) + 1;  // +1 för nollterminatorn
    
        // Försök att omallokera minne för destinationssträngen
        char* tmp = realloc(*destination, size);
        if (tmp == NULL) {
            
            printf("Memory allocation faild\n");
            return 0;
        }
    
        // Omfördelningen lyckades, så uppdatera destinationsvariabeln
        *destination = tmp;
    
        temp = strcat_s(*destination, size, source);
        if (temp != 0) {
            // Sammankoppling misslyckades
            printf("Sammankoppling misslyckades\n");
            return 0;
        }
    
        // Sammankoppling lyckades
        return 1;
    
    }
    
    void dstring_truncate(DString* destination, unsigned int truncatedLength)
    {
        if (destination == NULL) {
            return;
        }
    
        // Kontrollera att *destination inte är NULL
        if (*destination == NULL) {
            return;
        }
    
        // Kontrollera att truncatedLength inte är negativ
        if (truncatedLength < 0) {
            return;
        }
    
        // Omfördela minne för destinationssträngen
        char* tmp = realloc(*destination, truncatedLength + 1);  // +1 for the null terminator
    
        // kolla om realloc fungerade
        if (tmp == NULL) {
            // realloc misslyckas
            return;
        }
    
        // Omfördelningen lyckades, så uppdatera destinationsvariabeln
        *destination = tmp;
    
        // Set the null terminator at the truncatedLength
        (*destination)[truncatedLength] = '\0';
    }
    
    void dstring_print(DString str, FILE* textfile)
    {
        if (str == NULL || textfile == NULL) {   // kolla om textfill och str inte är NULL
            return;
        }
    
        // Skriv str till textfilen
        fputs(str, textfile);
    
    }
    
    void dstring_delete(DString* stringToDelete)
    {
        
        assert(stringToDelete != NULL);
    
        // Frigör minnet som pekas på av stringToDelete
        free(*stringToDelete);
        // Sätt stringToDelete till NULL
        *stringToDelete = NULL;
    }


    int main(void)
{
DString str1, str2;
str1 = dstring_initialize("Department of ");
str2 = dstring_initialize("Redundancy ");
int result = dstring_concatenate(&str1, str2); // Merges str1 and str2 and stores the result in str1. Str1 now contains "Department of Redundancy"
     assert(result == 1); //successfully allocated memory

/* If any of these fail, there is something wrong with your implementation
Use the debugger to find out what */

assert(str1 != NULL);
assert(str2 != NULL);
assert(strlen(str2) == 11);
assert(strlen(str1) == 25); // The merged string should have a length of 25

/* The following should print "Department of Redundancy Department" on the screen
stdout is a text file representing the console window */

dstring_print(str1, stdout); // Prints "Department of Redundancy"
dstring_truncate(&str1, 10); // Abbreviates str1 said to contain only the first 10 characters of the string, i.e. "Department"
     assert(strlen(str1) == 10);
     assert(strlen(str2) == 11);
dstring_print(str1, stdout); // Prints "Department"

/* Free the dynamically allocated memory for the strings */
dstring_delete(&str1);
dstring_delete(&str2);

/* Make sure the strings are zeroed */
assert(str1 == NULL);
assert(str2 == NULL);
return 0;
anders_k 237
Postad: 18 dec 2022 11:11 Redigerad: 18 dec 2022 11:38

Disclaimer -> Utan att ha sett hur DString ser ut, jag
antar det är en pekare. Normalt "gillas det inte" att
gömma en pekare i en typedef för det gör koden lite
svårare att läsa samt de kan orsaka problem i olika
situationer

Din dstring_initialize returnerar alltid NULL, i princip gör den ingenting.

// svårt att se nyttan, förutom att allokera 1 byte

DString dstring_initialize(const char* str)
{
  assert(str != NULL);
    
  str=(char*)malloc(sizeof(char));
  if (str == NULL) {
            
    printf("Memmory cannot be allocated\n");
  }
  else
  {
     printf("Memmory is allocated\n");
  } 
  free(str);
  return NULL; 
}

Antagligen ville du säkert istället skapa en DString däri och returnera den nya minnesblock med innehåll fr in-parametern. 

 

ChristopherH 753
Postad: 18 dec 2022 18:36

Testa OpenAI, den förklarar allt du gjort fel och fixar allting som är fel

Svara
Close