Array pointers 'werken niet'...

Status
Niet open voor verdere reacties.

JobNij

Gebruiker
Lid geworden
27 okt 2009
Berichten
190
Hallo allemaal,

Een poosje geleden heb ik een programmeeropdracht moeten maken op de Universiteit. De opdracht was onder andere een functie te schrijven die kijkt of je een weerstand kan maken door verschillende weerstanden op een bepaalde manier aan elkaar te schakelen (oftewel: serie en/of parallel). De opdracht was om deze functie zo te maken dat er eerst gekeken werd of de weerstand gemaakt kon worden met 2 weerstanden, daarna met 3, enzovoorts.

Nu heb ik een programmaatje geschreven, maar om de een of andere reden gaat het mis. Als ik bijvoorbeeld een pointer (int *R_prev) laat wijzen naar de array met oorspronkelijke weerstanden (R[12]) dan krijg ik alleen maar de eerste waarde door?!?

Het zou fijn zijn als iemand even naar mijn code zou willen kijken, waarschijnlijk is het gewoon een domme fout, maar ik kom er toch niet uit.

Alvast bedankt!

Job

De declaraties etc:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define N 10
#define NUMBER 5
int R[N]= {2,5,10,15,22,33,47,68,100,150};
int *R_prev = NULL;
int R_prev_size;

en de functie:
Code:
int solve_with_n_components(int R_goal)
{
    int i, j, k = 0, l;
	int size = 10;
	int* R_new;
	R_prev = R;
	for(l = 0; l < NUMBER; l++) {
		size = 2*10*size;
		R_new = (int *) malloc(size * sizeof(int) );
		for(i = 0; i < size; i++) {
			for(j = 0; j < N; j++) {
				R_new[k] = series(R_prev[i], R[j]);
				R_new[k++] = parallel(R_prev[i], R[j]);
				if(R_new[k] == R_goal || R_prev[k-1] == R_goal) {
				      return 1;
				}
			}
		}
		R_prev = R_new;
		k = 0;
	}
	return 0; // return 0 if R_goal not realized, otherwise return 1
}

Ps. de series() en parallel() functies kloppen, die heb ik namelijk bij de opdracht gekregen ;-)
 
Ik heb geen ervaring met C++ maar ik denk dat deze regel niet klopt.
Code:
R_new[k++] = parallel(R_prev[i], R[j]);

Probeer het is te vervangen door
Code:
++k

Vanwege dit
Code:
#include <iostream>

using namespace std;

int main()
{
    int b = 0, c = 0;
    cout << b++; // print 0
    cout << ++c; // print 1
    return 0;
}
 
Leuke opdracht, misschien ga ik hem ook een keertje maken (andere hobby: elektronica).

Je zegt:
>Nu heb ik een programmaatje geschreven, maar om de een of andere reden gaat het mis. Als ik bijvoorbeeld een pointer (int *R_prev) laat wijzen naar de array met oorspronkelijke weerstanden (R[12]) dan krijg ik alleen maar de eerste waarde door?!?
>

Dit is altijd zo omdat alleen het begin adres van het array wordt opgeslagen in de pointer.
Bij R_prev = R betekend dit dus dat de pointer R_prev gaat wijzen naar R[0].
Om hem naar een ander array-element te laten wijzen doe je R_prev = R + i. (test zelf ff of dit werkt in een loop met lopende i).

Waarom wil je eigenlijk in dit programma met pointers werken?
Je kunt ook de waarden van de arrayelementen gelijk naar integers of doubles kopieren.
Maar met pointers kan natuurlijk ook.

Verder:
Als je op de Universiteit van Leiden zit, krijg je waarschijnlijk op je donder van Walter voor het globaal declareren van een array.

Groetjes,

Kees
 
Haha, nee, Technische Universiteit Eindhoven heeft me zelf het skelet van het programma (inclusief de globale array) gegeven ;-)

De oplossing van Parnassan was een goede (voorlopige) oplossing. Ik heb met het debuggen dit foute over het hoofd gezien, en nu ziet het er dus zo uit:

Code:
R_new[k++] = series(R_prev[i], R[j]);
R_new[k++] = parallel(R_prev[i], R[j]);

Wat beter werkt.

Maar als ik nu voor 4 resistors het programmaatje laat werken, dan stopt het programmaatje met werken... Ik denk dat het iets te maken heeft met de loop die 80000 keer wordt doorlopen, maar helemaal zeker ben ik niet...

Zou iemand er nog eens naar willen/kunnen kijken?

Bijgevoegd het volledige programmaatje: Bekijk bijlage resistors.c.txt
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan