Merge sort with array of structs

  • Thread starter Thread starter Firestrider
  • Start date Start date
  • Tags Tags
    Array Sort
Click For Summary

Discussion Overview

The discussion revolves around implementing a merge sort algorithm using an array of structs in C, specifically focusing on how to correctly copy structs and handle string comparisons within the structs. Participants are addressing issues related to struct manipulation and memory allocation.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Homework-related

Main Points Raised

  • One participant expresses uncertainty about copying full structs into a temporary array based on an integer value within the struct.
  • Another participant suggests using the `strcmp` function for string comparisons instead of direct comparison.
  • A participant encounters an error related to using the `->` operator on a struct that is not a pointer, indicating a misunderstanding of struct access.
  • One participant proposes that directly assigning structs (e.g., `temp[mc] = birthdays[count1];`) might work for copying structs.
  • Another participant reports an error about incompatible types when trying to assign a string from one struct to another, highlighting issues with copying C-style strings.
  • Concerns are raised about accessing struct members after changing the type of the temporary array to a pointer, suggesting potential memory allocation issues.
  • A participant notes that there is no member called "first_name" in the defined struct, which could be a source of confusion in the code.

Areas of Agreement / Disagreement

Participants do not reach a consensus on the best approach to copy structs or handle string assignments, as multiple viewpoints and unresolved issues are presented throughout the discussion.

Contextual Notes

There are limitations regarding the handling of C-style strings and struct member access, which remain unresolved. Additionally, the definition of the struct `student_birthday` is incomplete, lacking clarity on its members.

Firestrider
Messages
104
Reaction score
0

Homework Statement



I need to be able to copy full structs in a temporary array based on a value in that struct (an integer), but I'm not sure exactly how to go about it. I have commented where I need to copy over structs.

Also in the other code block, what is the problem here? It doesn't seem to reconize the string.

Homework Equations



N/A

The Attempt at a Solution



Code:
void Merge(struct student_birthday birthdays[], int start, int middle, int end) 
{
   int* temp, i, length, count1, count2, mc;
  
   length = end - start + 1;
   temp = calloc(length, sizeof(struct student_birthday));

   count1 = start;
   count2 = middle;
  
   mc = 0;

   while ((count1 < middle) && (count2 <= end)) 
   {
      if (birthdays[count1].ymd < birthdays[count2].ymd) 
      {
         temp[mc] = birthdays[count1].ymd; // structs not values!
         count1++;
         mc++;
      }
    
      else 
      {
         temp[mc] = birthdays[count2].ymd; // structs not values!
         count2++;
         mc++;
      }
   }

   if (count1 < middle) 
   {
      for (i = mc; i < length; i++) 
      {
         temp[i] = birthdays[count1].ymd; // structs not values!
         count1++;
      }
   }
  
   else if (count2 <= end) 
   {
      for (i = mc; i < length; i++) 
      {
         temp[i] = birthdays[count2].ymd; // structs not values!
         count2++;
      }
   }

   for (i = start; i <= end; i++)
      birthdays[i].ymd = temp[i - start]; // structs not values!

   free(temp);
}

Code:
int MonthToInt(char month[9]);

struct student_birthday
{
   char month[9];
};

int main(void)
{
   m_int = MonthToInt(birthdays[j].month);
}

int MonthToInt(char month[9])
{
    int m_int = 0;
    
    if (month == "JANUARY") m_int = 1; 
    else if (month == "FEBRUARY") m_int = 2;
    else if (month == "MARCH") m_int = 3;
    else if (month == "APRIL") m_int = 4;
    else if (month == "MAY") m_int = 5;
    else if (month == "JUNE") m_int = 6;
    else if (month == "JULY") m_int = 7;
    else if (month == "AUGUST") m_int = 8;
    else if (month == "SEPTEMBER") m_int = 9;
    else if (month == "OCTOBER") m_int = 10;
    else if (month == "NOVEMBER") m_int = 11;
    else if (month == "DECEMBER") m_int = 12;
       
    return m_int;
}
 
Physics news on Phys.org
It seems I have to use the strcmp function for the second code block.

Does anyone know why this statement will not work:

Code:
struct student_birthday* temp;
int i, length, count1, count2, mc;

length = end - start + 1;
temp = calloc(length, sizeof(struct student_birthday));

temp[mc]->first_name = birthdays[count1].first_name;

It says "invalid type argument of `->' ". I just want to copy each individual piece of the struct one by one, or if possible the whole struct...

Any help is appreciated!
 
Firestrider said:
It says "invalid type argument of `->' ".
That's because temp[mc] isn't a pointer. You wanted `.'.
 
Firestrider: For your first code block, would this work? temp[mc] = birthdays[count1];
 
Hi, and thanks for your help.

When I do this:

Code:
temp[mc].first_name = birthdays[count1].first_name;

I get the error "incompatible types in assignment"

This is the function:

Code:
void Merge(struct student_birthday birthdays[], int start, int middle, int end)
 
nvn said:
Firestrider: For your first code block, would this work? temp[mc] = birthdays[count1];

That works when I change temp to a pointer to a struct, but I get weird values when accessing pieces of the struct. It probably has something do with how memory is allocated.

Does anyone know why I get that error from my previous post? I'm running into this a lot and I'm not sure why I get it.
 
Firestrider said:
Code:
temp[mc].first_name = birthdays[count1].first_name;

If first_name is supposed to be an array of char, then remember that you can't copy C-style arrays by assignment.

But... I don't see any member called "first_name" in struct student_birthday.
 

Similar threads

  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 1 ·
Replies
1
Views
4K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 18 ·
Replies
18
Views
3K
  • · Replies 8 ·
Replies
8
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 12 ·
Replies
12
Views
3K