Need help soon with C++ program using pointers and arrays

Click For Summary

Discussion Overview

The discussion revolves around troubleshooting a C++ program that uses pointers and arrays to calculate the average of user-inputted numbers and determine how many of those numbers are greater than the average. Participants are addressing issues related to memory allocation, pointer management, and array resizing.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant notes that the program does not display the correct average value, suggesting potential issues with pointers and arrays.
  • Another participant identifies multiple problems, including incorrect array size allocation and failure to copy data when resizing the array.
  • There is a suggestion to allocate a larger initial array size (e.g., 100 or 1000) to accommodate user input more effectively.
  • Some participants discuss the need to copy old values to a new array before deleting the old array to avoid invalid memory access.
  • One participant expresses uncertainty about using `memcpy()` and asks whether a for loop would be a suitable alternative for copying values.
  • Another participant emphasizes the importance of ensuring that the old values are accessible during the copying process before deletion of the old array.

Areas of Agreement / Disagreement

Participants generally agree that there are significant issues with the current implementation of the program, particularly regarding memory management and array resizing. However, there is no consensus on the best approach to implement the necessary corrections, as different methods for copying data and managing pointers are suggested.

Contextual Notes

Limitations include the potential for undefined behavior due to improper memory management, such as deleting arrays without copying their contents. There are also unresolved questions about the correct implementation of data copying techniques.

twotaileddemon
Messages
258
Reaction score
0
Okay so I got the majority of my program complete, however when I try to run it it doesn't display the proper value of the average. I think I somehow messed up using my pointers and arrays, but I can't locate the problem and I've spent hours trying to fix it to no avail. see comments for better description of program.

-------

#include <iostream>

using namespace std;

/* Write a program to read in a series of numbers and display how many
are greater than their average. The user will indicate that there are no more numbers.
by entering a -999. This lab requires that you use new and delete. */

int main ( )
{
// Declaration of variables
int index = 0;
int count = 0;
int amount = 0;
int sum = 0;
int capacity = 2;
int * number;
number = new int[capacity];

// Puts the numbers the user enters into an array
// Keeps track of their sum;
// Keeps track of the numbers entered;
while(true)
{
count <<"Enter a number: ";
cin >> number[index];

if (number[index] == -999)break;

sum = sum + number[index];
amount++;

if (index == capacity)
{
int * tmp = new int[capacity];
number = tmp;
delete []tmp;
}

index++;
}

// Accumulator variable to count numbers larger than average
for (index = 0; index <= amount; index++)
{
if (number[index] > (sum / amount)) count++;
}

// Output
count << "There are " << count
<< " numbers greater than their average." << endl;


return 0;
}
 
Technology news on Phys.org
Several problems,
You create an array with 2 items, but you use elements greater than 0 or 1.
You create a new array to exapand it, but the new array is the same size and you don't copy the data to the new array you copy the pointer.
You create an array, copy the pointer and then delete the array, the memory the number pointer points at is no longer valid.

You have most of the ideas correct,
Allocate an array of a reasonable size 100 or 1000 entries if the user is entering them by hand.
Keep track of how many number have been entered and if you have to allocate more space make a new array twice the size of the old one and copy the data using either memcpy() or just looping through the values.

ps. Be careful about the result of dividing one integer by another.
 
Last edited:
At the office, if you run out of filing cabinet space, you might seek to increase your capacity. What's wrong with the following directions for doing so?

1. Acquire new filing cabinet.
2. Install new filing cabinet.
3. Put old filing cabinet in the dumpster.

(Hint: think very literally)
 
mgb_phys said:
Several problems,
You create an array with 2 items, but you use elements greater than 0 or 1.
You create a new array to exapand it, but the new array is the same size and you don't copy the data to the new array you copy the pointer.
You create an array, copy the pointer and then delete the array, the memory the number pointer points at is no longer valid.

You have most of the ideas correct,
Allocate an array of a reasonable size 100 or 1000 entries if the user is entering them by hand.
Keep track of how many number have been entered and if you have to allocate more space make a new array twice the size of the old one and copy the data using either memcpy() or just looping through the values.

ps. Be careful about the result of dividing one integer by another.
hm.. I think I can go on this. I'm supposed to start with 2 "elements" for the array and allocate 2 more spaces for the "elements" each time they are filled up...
and I'm supposed to use pointers or something.

I can change them to double no problem though.
 
Even if you only allocate 2 extra elements at a time, you still have to copy the old values to the new array before deleting the old array.
 
mgb_phys said:
Even if you only allocate 2 extra elements at a time, you still have to copy the old values to the new array before deleting the old array.

do I use pointers to do this?

EDIT: "memcpy() or just looping through the values."
I've never used memcpy() before and am unfamiliar with it. Should I use a for loop to copy the old values? How do I go about doing this?

if (index == capacity)
{
capacity = capacity + 2;
int * tmp = new int[capacity];
number = tmp;
delete []tmp;
}

I added capacity = capacity + 2 each time this if loop runs through, that way when the whole for loop repeats, it has allocated 2 more memory.. I think. Not sure about how to copy data though.
 
You should be able to access the values of the old array, copy them in, as they exist in the memory, and then delete it after the for loop, as you would if you were to take a pointer to an int value and store it another pointer to int, and then delete it. So yes it's possible
 

Similar threads

Replies
5
Views
2K
Replies
20
Views
2K
  • · Replies 17 ·
Replies
17
Views
4K
  • · Replies 23 ·
Replies
23
Views
2K
  • · Replies 31 ·
2
Replies
31
Views
3K
  • · Replies 66 ·
3
Replies
66
Views
6K
Replies
12
Views
2K
  • · Replies 30 ·
2
Replies
30
Views
5K
  • · Replies 25 ·
Replies
25
Views
3K
  • · Replies 32 ·
2
Replies
32
Views
4K