Question

The following C code keeps returning a segmentation fault! Please debug so that it compiles. Also...

The following C code keeps returning a segmentation fault! Please debug so that it compiles. Also please explain why the seg fault is happening. Thank you

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

// @Name    loadMusicFile
// @Brief   Load the music database
//          'size' is the size of the database.
char** loadMusicFile(const char* fileName, int size){
  FILE *myFile = fopen(fileName,"r");
  
  // Allocate memory for each character-string pointer
  char** database = malloc(sizeof(char*)*size);
 
  unsigned int song=0;
  for(song =0; song < size; song++){
      // Allocate memory for each individual character string
      database[song] = malloc(sizeof(char)*80);
      // Copy over string
      database[song] = fgets(database[song],sizeof(char)*80,myFile);
  }
  
  // Import to always remember to close any file we open.
  fclose(myFile);
  // Return the pointer to our database
  return database;
}


// @Name    printArrayOfCharStrings
// @Brief   Prints an array of C-style strings
void printArrayOfCharStrings(char** array, unsigned int start, unsigned int end){
  int i;
  for(i = start; i < end; i++){
    printf("[%d] %s",i,array[i]);
  }
}

// @Name    swapStrings
// @Brief   Swaps two strings.
//          The lower string is put first
void swapStrings(char** s1, char** s2){
  if( strcmp(*s1,*s2)==0 ){
    // Strings are identical, do nothing
    return;
  }else if( strcmp(*s1,*s2) < 0 ){
    // Do nothing--we are already sorted
    return;
  }else{
    char* temp = *s1;
    *s1 = *s2;
    *s2 = temp;
  }
}

// @Name    bruteForceSort
// @Brief   A simple O(N*N) sorting algorithm.
void bruteForceSort(char** array, unsigned int start, unsigned int end){
    int i,j;
    for(i =start; i < end-1; i++){
        for(j =start; j < end-1; j++){
            // Note the swap here.
            swapStrings(&array[j],&array[j+1]);
        }
    }

}

// @Name    partition
// @Brief   Helper funcion for quicksort
int partition(char** array, unsigned int low, unsigned int high){
    // TODO:
        char** pivot = &array[high];
        int i = (low - 1);
        
        for (int j = low; j <= high - 1; j++){
                if (array[j] <= pivot){
                        i++;
                        swapStrings(&array[i], &array[j]);
                }
        }
        swapStrings(&array[i + 1], &array[high]);
        return (i + 1);

}

void quicksort(char** array, unsigned int low, unsigned int high){
    // TODO:
        if (low < high){
                int pivot = partition(array, low, high);
                quicksort(array, low, pivot - 1);
                quicksort(array, low, pivot +1);
        }
}


int main(){
  // Load our unsorted music file
  // We load two copies, as we will compare two sorting algorithms.
  char** musicDatabase1 = loadMusicFile("./musicdatabase.txt",13609);
  char** musicDatabase2 = loadMusicFile("./musicdatabase.txt",13609);
  // Print out a portion of the music database.
  printf("The first 10 entries of 13609 unsorted are...\n"); 
  printArrayOfCharStrings(musicDatabase1,0,10);
  printf("\n");
  
  // ===========================================
  // ===== Experiment 1 - Using Brute Force Sort ====
  // Create a clock to measure the elapsed time
  clock_t start1,end1;
  start1 = clock();
  // perform bruteForceSort after starting your timer
  bruteForceSort(musicDatabase1,0,13609);
  end1 = clock(); 
  double experiment1 = ((double)(end1-start1)/CLOCKS_PER_SEC);
   // ===========================================
   
  // ===========================================
  // ===== Experiment 2 - Using Quick Sort ====
  //printArrayOfCharStrings(musicDatabase2,0,994);
  // Create a clock to measure the elapsed time
  clock_t start2,end2;
  start2 = clock();
  // perform quicksort after starting your timer
  quicksort(musicDatabase2,0,13609);  
  end2 = clock();
  double experiment2 = ((double)(end2-start2)/CLOCKS_PER_SEC);
  // ===========================================
 
  // check correctness
  const int items = 10; // change this to up to 13609
  printf("O(N*N) sort produces\n"); 
  printArrayOfCharStrings(musicDatabase1,0,items);
  printf("\n quick sort produces\n"); 
  printArrayOfCharStrings(musicDatabase2,0,items);  
  // ============ Results ============== 
  printf("\nResults of sorting:\n");
  printf("%f time taking for brute force\n", experiment1);
  printf("%f time taking for quick sort\n", experiment2);
  
  return 0;
}
0 0
Add a comment Improve this question Transcribed image text
Answer #1

// at line 82 pointer typecasting required

// and you have to check file is open or not

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

// @Name loadMusicFile
// @Brief Load the music database
// 'size' is the size of the database.
char** loadMusicFile(const char* fileName, int size){
FILE *myFile = fopen(fileName,"r");
if (myFile == NULL)
{
printf("File Not Found: %s ",fileName);
exit(1);
}
  
// Allocate memory for each character-string pointer
char** database = malloc(sizeof(char*)*size);

unsigned int song=0;
for(song =0; song < size; song++){
// Allocate memory for each individual character string
database[song] = malloc(sizeof(char)*80);
// Copy over string
database[song] = fgets(database[song],sizeof(char)*80,myFile);
}
  
// Import to always remember to close any file we open.
fclose(myFile);
// Return the pointer to our database
return database;
}


// @Name printArrayOfCharStrings
// @Brief Prints an array of C-style strings
void printArrayOfCharStrings(char** array, unsigned int start, unsigned int end){
int i;
for(i = start; i < end; i++){
printf("[%d] %s",i,array[i]);
}
}

// @Name swapStrings
// @Brief Swaps two strings.
// The lower string is put first
void swapStrings(char** s1, char** s2){
if( strcmp(*s1,*s2)==0 ){
// Strings are identical, do nothing
return;
}else if( strcmp(*s1,*s2) < 0 ){
// Do nothing--we are already sorted
return;
}else{
char* temp = *s1;
*s1 = *s2;
*s2 = temp;
}
}

// @Name bruteForceSort
// @Brief A simple O(N*N) sorting algorithm.
void bruteForceSort(char** array, unsigned int start, unsigned int end){
int i,j;
for(i =start; i < end-1; i++){
for(j =start; j < end-1; j++){
// Note the swap here.
swapStrings(&array[j],&array[j+1]);
}
}

}

// @Name partition
// @Brief Helper funcion for quicksort
int partition(char** array, unsigned int low, unsigned int high){
// TODO:
char** pivot = &array[high];
int i = (low - 1);
  
for (int j = low; j <= high - 1; j++){
if (array[j] <= (char*)pivot){
i++;
swapStrings(&array[i], &array[j]);
}
}
swapStrings(&array[i + 1], &array[high]);
return (i + 1);

}

void quicksort(char** array, unsigned int low, unsigned int high){
// TODO:
if (low < high){
int pivot = partition(array, low, high);
quicksort(array, low, pivot - 1);
quicksort(array, low, pivot +1);
}
}


int main(){
// Load our unsorted music file
// We load two copies, as we will compare two sorting algorithms.
char** musicDatabase1 = loadMusicFile("./musicdatabase.txt",13609);
char** musicDatabase2 = loadMusicFile("./musicdatabase.txt",13609);
// Print out a portion of the music database.
printf("The first 10 entries of 13609 unsorted are... ");
printArrayOfCharStrings(musicDatabase1,0,10);
printf(" ");
  
// ===========================================
// ===== Experiment 1 - Using Brute Force Sort ====
// Create a clock to measure the elapsed time
clock_t start1,end1;
start1 = clock();
// perform bruteForceSort after starting your timer
bruteForceSort(musicDatabase1,0,13609);
end1 = clock();
double experiment1 = ((double)(end1-start1)/CLOCKS_PER_SEC);
// ===========================================

// ===========================================
// ===== Experiment 2 - Using Quick Sort ====
//printArrayOfCharStrings(musicDatabase2,0,994);
// Create a clock to measure the elapsed time
clock_t start2,end2;
start2 = clock();
// perform quicksort after starting your timer
quicksort(musicDatabase2,0,13609);
end2 = clock();
double experiment2 = ((double)(end2-start2)/CLOCKS_PER_SEC);
// ===========================================

// check correctness
const int items = 10; // change this to up to 13609
printf("O(N*N) sort produces ");
printArrayOfCharStrings(musicDatabase1,0,items);
printf(" quick sort produces ");
printArrayOfCharStrings(musicDatabase2,0,items);
// ============ Results ==============
printf(" Results of sorting: ");
printf("%f time taking for brute force ", experiment1);
printf("%f time taking for quick sort ", experiment2);
  
return 0;
}

Add a comment
Know the answer?
Add Answer to:
The following C code keeps returning a segmentation fault! Please debug so that it compiles. Also...
Your Answer:

Post as a guest

Your Name:

What's your source?

Earn Coins

Coins can be redeemed for fabulous gifts.

Not the answer you're looking for? Ask your own homework help question. Our experts will answer your question WITHIN MINUTES for Free.
Similar Homework Help Questions
  • c++ please read all question edit the program to test different random sizes of the array and give me the time in a file will be like random size of the array and next to it the time it took for each...

    c++ please read all question edit the program to test different random sizes of the array and give me the time in a file will be like random size of the array and next to it the time it took for each size Im trying to do time analysis for Quick sort but i keep getting time = 0 also i want edit the program to test different random sizes of the array and give me the time in a...

  • I am getting the Segmentation fault error on the Ubuntu machine but not on macOS. Any...

    I am getting the Segmentation fault error on the Ubuntu machine but not on macOS. Any help would be appreciated. /**** main.c ****/ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <pthread.h> #include <string.h> #define WORD_LEN 6 #define TOP 10 char * delim = "\"\'.“”‘’?:;-,—*($%)! \t\n\x0A\r"; struct Word { char word[30]; int freq; }; int threadCount; int fileDescriptor; int fileSize; off_t chunk; struct Word* wordArray; int arrIndex = 0; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;...

  • this is c code. please answer all questions on a piece of paper and show work....

    this is c code. please answer all questions on a piece of paper and show work. i need to prepare as i have a midterm i will have to be completing on paper 1) Bit Operators: This C program compiles and runs. What is its output? 1) #include <stdio.h> 2) void main (void) 3) unsigned char x =60; 4) 5) 6) 7) 8 ) 9) 10) 11) 12) 13) unsigned char a = x < 1; unsigned char b unsigned...

  • Hello, I want to check if my C++ code is correct and follows the requeriments described...

    Hello, I want to check if my C++ code is correct and follows the requeriments described thanks. Requeriments: Assignment Sorting Benchmark each of the sorting methods listed below. Insertion Sort Bubble Sort Selection Sort Heap Sort. Quick Sort. Merge Sort. Benchmark each of the above sorting methods for data sizes of 10000, 20000, 30000, 40000 and 50000. Display the results in a table as shown below. The table should have rows and columns. However, the rows and columns need not...

  • The goal is to generate some random number and output a sorted list by quicksort. what...

    The goal is to generate some random number and output a sorted list by quicksort. what do I need to add in my main to accomplish that? i also want it to output the run time. thank you #include "pch.h" #include <iostream> using namespace std; /* C implementation QuickSort */ #include<stdio.h> void swap(int* a, int* b) {    int t = *a;    *a = *b;    *b = t; } int partition(int arr[], int low, int high) {   ...

  • I want to compare the runtimes and swap operations times among quick Sort, selection Sort and...

    I want to compare the runtimes and swap operations times among quick Sort, selection Sort and shell Sort here is my code: But when I create a 1000,000 size array, I can't get the result of the operations times and runtime. what's wrong with my code? and I also want to copy the array. Because I want to use same array for three sort. And for the shell Sort, I haven't learn it in my class. Can anyone help me...

  • I'm trying to code a C program so it sorts an array of integer numbers of...

    I'm trying to code a C program so it sorts an array of integer numbers of size n in ascending order. My code is written below but its not working properly, its giving me errors, I think my sort and swap functions aren't done right maybe, please help and fix. It says "undefined reference to "SelectionSort" as an error. But the question asks to not change the PrintArray and Main function. #include <stdio.h> void PrintArray(int size, int array[]) { for...

  • C++. Difficulty with quickSort function. Code will not run quickSort function. The code I'm having trouble...

    C++. Difficulty with quickSort function. Code will not run quickSort function. The code I'm having trouble with is in bold. -------------------------------------------------------------------------------------------------driverProgram.cpp #include #include #include #include #include "quickSort.cpp" using namespace std; int main() { const int MIN_SIZE = 4; //Array size const int SIZE = 25; int theArray[SIZE] = {11, 22, 33, 44, 55, 66, 77, 88, 99, 12, 13, 14, 15, 16, 17, 18, 19, 18, 19, 20, 21, 22, 23, 24, 25}; cout << "List of 25 items: ";...

  • Merge Sort: Time Complexity: O(n log(n)) #include "stdafx.h" #include <iostream> #include <time.h> #include <stdlib.h> using namespace...

    Merge Sort: Time Complexity: O(n log(n)) #include "stdafx.h" #include <iostream> #include <time.h> #include <stdlib.h> using namespace std; void combine(int *a, int low, int high, int mid) {        int i, j, k, c[100000];        i = low;        k = low;        j = mid + 1;        while (i <= mid && j <= high)        {               if (a[i] < a[j])               {                      c[k] = a[i];                      k++;                      i++;               }               else               {                     ...

  • Rewrite this code in Java please #include <iostream> #include <fstream> #include <cstdlib> #include <ctime> using namespace...

    Rewrite this code in Java please #include <iostream> #include <fstream> #include <cstdlib> #include <ctime> using namespace std; long length = 1000; const long max_length = 100000; int list[max_length]; void read() {     ifstream fin("random.dat", ios::binary);     for (long i = 0; i < length; i++)     {         fin.read((char*)&list[i], sizeof(int));     }     fin.close(); } void bubbleSort() {     int temp;     for(long i = 0; i < length; i++)     {         for(long j = 0; j< length-i-1; j++)...

ADVERTISEMENT
Free Homework Help App
Download From Google Play
Scan Your Homework
to Get Instant Free Answers
Need Online Homework Help?
Ask a Question
Get Answers For Free
Most questions answered within 3 hours.
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT