| | |
Dynamic array management
Please support our C advertiser: Programming Forums - DaniWeb Sister Site
![]() |
•
•
Join Date: Feb 2007
Posts: 30
Reputation:
Solved Threads: 0
Hi, im trying to create a program that will control a dynamic array .
The program have few functions to handle dynamic array.
* Add number to array
* Erase number from array
* Print the array
I have two problems with my code .
The first one is with the EraseNumber function .
I just cant understand why it doesnt work like it should ,
The second is that every time that the menu pops up , that text
Of the menu start to be really messy for some reason .
Maybe one of you would take a look at the code and tell me what he
Thinks that the problem is .
Btw. im using Turbo C , and im runing it on a win2k OS.
The program have few functions to handle dynamic array.
* Add number to array
* Erase number from array
* Print the array
I have two problems with my code .
The first one is with the EraseNumber function .
I just cant understand why it doesnt work like it should ,
The second is that every time that the menu pops up , that text
Of the menu start to be really messy for some reason .
Maybe one of you would take a look at the code and tell me what he
Thinks that the problem is .
Btw. im using Turbo C , and im runing it on a win2k OS.
C Syntax (Toggle Plain Text)
#include <stdio.h> #include <stdlib.h> #include <alloc.h> #include <conio.h> // Functions proto-type void mainMenu(); void memoryTester(int *array); int* addNumber(int *array,int arraysize,int var); int* eraseNumber(int *array,int arraysize,int var); void printfArray(int *array,int arraysize); // Main function int main() { int *array = NULL; int arraysize = 0; int var = 0; int choice; // Main loop while (choice != 4) { mainMenu(); printf ("Enter your choice: "); scanf ("%d",&choice); switch (choice) { case 1: printf ("Add number: "); scanf ("%d",&var); arraysize++; array = addNumber(array,arraysize,var); break; case 2: printf ("Erase number: "); scanf ("%d",&var); arraysize--; array = eraseNumber(array,arraysize,var); break; case 3: putchar('\n'); printf ("**** PRINTING ARRAY ****\n\n"); printfArray (array,arraysize); getch(); break; case 4: printf ("Press any key to quit...\n"); getch(); break; default: printf ("Wrong choice!\n"); printf ("Press any key to continue...\n"); getch(); break; } } free (array); return 0; } // Main menu function void mainMenu() { clrscr(); printf ("**** MAIN MENU ****\n\n"); printf ("1. Add number...\n"); printf ("2. Erase number...\n"); printf ("3. Print array...\n"); printf ("4. Quit...\n"); putchar ('\n'); } // Memory test function void memoryTest(int *array) { if (array == NULL) { printf ("Failed to allocate memory!\n"); printf ("Press any key to quit...\n"); getch(); exit(1); } } // Add number function int* addNumber(int *array,int arraysize,int var) { int *temp,i; if (array == NULL) { array = (int *) malloc (arraysize * sizeof(int)); memoryTest(array); array[0] = var; } else { temp = array; array = (int *) malloc (arraysize * sizeof(int)); memoryTest(array); for (i=0;i<arraysize-1;i++) array[i] = temp[i]; array[i] = var; } free (temp); return array; } // Erase number function int* eraseNumber(int *array,int arraysize,int var) { int *temp,i,tmp=0; if (arraysize == 0) { array = NULL; return array; } for (i=0;i<arraysize+1;i++) { if (array[i] == var) tmp = 1; } if (tmp == 0) { printf ("Error: No such number!\n"); printf ("Press any key...\n"); getch(); return array; } temp = array; array = (int *) malloc (arraysize * sizeof(int)); memoryTest(array); for (i=0;i<arraysize;i++) { if (temp[i] == var) continue; else array[i] = temp[i]; } free (temp); return array; } // Print array function void printfArray(int *array,int arraysize) { int i; for (i=0;i<arraysize;i++) printf ("%d,",array[i]); putchar('\n'); }
C Syntax (Toggle Plain Text)
// Functions proto-type void mainMenu(); void memoryTester(int *array); int* addNumber(int *array,int arraysize,int var); int* eraseNumber(int *array,int arraysize,int var); void printfArray(int *array,int arraysize); // Main function int main() { int *array = NULL; int arraysize = 0; int var = 0; int choice; // Main loop while (choice != 4) { mainMenu(); printf ("Enter your choice: "); scanf ("%d",&choice); switch (choice) { case 1: printf ("Add number: "); scanf ("%d",&var); arraysize++; array = addNumber(array,arraysize,var); break; case 2: printf ("Erase number: "); scanf ("%d",&var); arraysize--; array = eraseNumber(array,arraysize,var); break; case 3: putchar('\n'); printf ("**** PRINTING ARRAY ****\n\n"); printfArray (array,arraysize); getch(); break; case 4: printf ("Press any key to quit...\n"); getch(); break; default: printf ("Wrong choice!\n"); printf ("Press any key to continue...\n"); getch(); break; } } free (array); return 0; } // Main menu function void mainMenu() { // clrscr(); printf ("**** MAIN MENU ****\n\n"); printf ("1. Add number...\n"); printf ("2. Erase number...\n"); printf ("3. Print array...\n"); printf ("4. Quit...\n"); putchar ('\n'); } // Memory test function void memoryTest(int *array) { if (array == NULL) { printf ("Failed to allocate memory!\n"); printf ("Press any key to quit...\n"); getch(); exit(1); } } // Add number function int* addNumber(int *array,int arraysize,int var) { int *temp,i; if (array == NULL) { array = (int *) malloc (arraysize * sizeof(int)); memoryTest(array); array[0] = var; } else { temp = array; array = (int *) malloc (arraysize * sizeof(int)); memoryTest(array); for (i=0;i<arraysize-1;i++) array[i] = temp[i]; array[i] = var; } free (temp); return array; } // Erase number function int* eraseNumber(int *array,int arraysize,int var) { int *temp,i,tmp=0; if (arraysize == 0) { array = NULL; return array; } for (i=0;i<arraysize+1;i++) { if (array[i] == var) tmp = 1; } if (tmp == 0) { printf ("Error: No such number!\n"); printf ("Press any key...\n"); getch(); return array; } temp = array; array = (int *) malloc (arraysize * sizeof(int)); memoryTest(array); for (i=0;i<arraysize;i++) { if (temp[i] == var) continue; else array[i] = temp[i]; } free (temp); return array; } // Print array function void printfArray(int *array,int arraysize) { int i; for (i=0;i<arraysize;i++) printf ("%d,",array[i]); putchar('\n'); }
Last edited by thekashyap; Mar 26th, 2007 at 6:21 am.
Problems I see:
1. Line 84: Very first insertion happens in slot 0 whereas the arraysize passed would be 1 at that time.
For all other insertions (where arraysize passed is > 0) the insertion happens at index arraysize. => Inconsistant.
2. Line 112: According to Line 84, it's possible to have a valid number at index 0. => Consider initializing tmp to -1 instead of 0.
3. Line 95: This free() will crash on first insertion as tmp isn't initialized then. Should be moved inside the else part above.
4. Line 110: Seems like a typo, should be tmp = i.
5. Line 124: Although it is assumed by caller (main()) that one call to eraseNumber() will erase ONE entry (because main() does arraysize-- on line 31), because of condition on line 124, if the array contained multiple entries for same number then all of them will be removed.
So say if before a call to eraseNumber() array size of 20 and number X was repeated 5 times in array. After a call to erase
- the variable arraysize will be 19
- array will contain 15 valid numbers (all except those five X)
- last 4 elements in the array would be junk (uninitialized).
A few suggesions:
>> The second is that every time that the menu pops up , that text Of the menu start to be really messy for some reason .
Use fflush(0) before every call to scanf(). See documentation of fflush() to see why.
1. Do not change the value of arraysize inside main(), pass it by pointer to add/eraseNumber functions and let it be changed there.
2. Consider using memcpy() instead of for-loops to copy from temp-array to real array and vise-versa.
3. Take a decision abt how you wanna handle repetaion of same number. Change add/errase appropriately. If you don't want repetation you can give error from addNumber().
1. Line 84: Very first insertion happens in slot 0 whereas the arraysize passed would be 1 at that time.
For all other insertions (where arraysize passed is > 0) the insertion happens at index arraysize. => Inconsistant.
2. Line 112: According to Line 84, it's possible to have a valid number at index 0. => Consider initializing tmp to -1 instead of 0.
3. Line 95: This free() will crash on first insertion as tmp isn't initialized then. Should be moved inside the else part above.
4. Line 110: Seems like a typo, should be tmp = i.
5. Line 124: Although it is assumed by caller (main()) that one call to eraseNumber() will erase ONE entry (because main() does arraysize-- on line 31), because of condition on line 124, if the array contained multiple entries for same number then all of them will be removed.
So say if before a call to eraseNumber() array size of 20 and number X was repeated 5 times in array. After a call to erase
- the variable arraysize will be 19
- array will contain 15 valid numbers (all except those five X)
- last 4 elements in the array would be junk (uninitialized).
A few suggesions:
>> The second is that every time that the menu pops up , that text Of the menu start to be really messy for some reason .
Use fflush(0) before every call to scanf(). See documentation of fflush() to see why.
1. Do not change the value of arraysize inside main(), pass it by pointer to add/eraseNumber functions and let it be changed there.
2. Consider using memcpy() instead of for-loops to copy from temp-array to real array and vise-versa.
3. Take a decision abt how you wanna handle repetaion of same number. Change add/errase appropriately. If you don't want repetation you can give error from addNumber().
![]() |
Similar Threads
- get length of a dynamic array (C++)
- works for static need help to make it dynamic (C++)
- dynamic array of structures problem (C++)
Other Threads in the C Forum
- Previous Thread: print the fields of a structure
- Next Thread: reading data from text fies in c
| Thread Tools | Search this Thread |
#include * ansi append array arrays asterisks bash binarysearch centimeter changingto char character convert copyimagefile cprogramme creafecopyofanytypeoffileinc database dynamic execv feet fgets file floatingpointvalidation fork framework function getlogicaldrivestrin givemetehcodez grade gtkwinlinux hacking histogram ide inches include incrementoperators infiniteloop initialization input interest intmain() iso kernel keyboard kilometer license linked linkedlist linux list lists locate looping lowest matrix meter microsoft number oddnumber opendocumentformat openwebfoundation overwrite owf pdf pointer posix power probleminc process program programming radix recursion recv recvblocked research reversing segmentationfault sequential single socket socketprograming socketprogramming standard strchr string suggestions systemcall test testing threads turboc unix urboc user variable wab whythiscodecausesegmentationfault windowsapi





