[C++] Dubbi su funzioni e allocazione dinamica

mklplo751
Salve, durante la scorsa settimana abbiamo fatto un'esercitazione su C++ in vista dell'esame. Due di questi esercizi mi hanno dato dei problemi e come al solito il professore ci dice che abbiamo sbagliato ma non ci dice dove, anche se richiesto. Dunque, per capire bene questi concetti vorrei richiedere un vostro aiuto.
Il primo dubbio riguarda questo esercizio in cui ci chiede di trovare in una matrice la colonne con il maggior numero di numeri dispari:

In questo primo programma penso che il problema sia nel mio porre $l Per quanto riguarda il secondo programma, non so come farlo nel senso che mi si richiede di prendere due vettori e SENZA usare un altro array d'appoggio di centrare il secondo nel primo (per esempio se $a=(1,2,3,4,5,6)$ e $b=(7,8)$ a dovrà essere $a=(1,2,3,7,8,4,5,6)$) il mio problema è come aumentare la dimensione di $a$ senza causare problemi, dato che se uso "new" l'indirizzo di memoria dovrebbe cambiare.
Se non vi reca disturbo, quando e se avete tempo, potreste aiutarmi?
Grazie per aver letto.

Risposte
Raptorista1
Quale valore restituisce la funzione [inline]c[/inline]?

mklplo751
Allora, nel ciclo for mi restiuisce sempre lo stesso valore e non capisco il perchè.

Raptorista1
Sono sinceramente sorpreso XDD

Il compilatore non ti aiuta per niente? Prova a compilare con [inline]-Wall -Werror[/inline].

mklplo751
Ok, ho capito dov'era l'errore: se ci fai caso ho mancato il "return k"...
Invece per l'altro esercizio ancora non ho trovato un modo per estendere l'array.
p.s: per curiosità cosa signifacano "-wall" "-werror"?

Raptorista1
"mklplo":
Ok, ho capito dov'era l'errore: se ci fai caso ho mancato il "return k"...

Io ci avevo fatto caso :P
"mklplo":

p.s: per curiosità cosa signifacano "-wall" "-werror"?

Sono indicazioni per il compilatore di considerare tutti i warning [Wall = all warnings] e di trattare i warning come error [Werror = warnings are errors].

"mklplo":

Invece per l'altro esercizio ancora non ho trovato un modo per estendere l'array.

Conosci la funzione [inline]realloc[/inline]?

mklplo751
Grazie per la risposta. Per quanto riguarda gli array abbiamo visto solo il "new" e il "delete" e cosa sono "*" e "&" il resto non l'abbiamo visto.

Raptorista1
Ah giusto, realloc funziona solo con malloc, dimentica quello che ho scritto!

vict85
Per estendere un array lo si copia in un array più grande. Anche la funzione realloc e la classe vector lo fanno.

Quindi, allochi un nuovo array più grande:
int* newArray = new int[nuovaDimensione];

Copi il vecchio array nel nuovo (con memmove, memcpy, copy oppure con un semplice loop for).
for( int i = 0; i != vecchiaDimensione; ++i )
{
    newArray[i] = array[i];
}

Infine deallochi quello vecchio
delete[] array;

e copi il nuovo puntatore in quello vecchio (ho anche messo l'altro uguale a [inline]nullptr[/inline] perché è spesso considerata una buona prassi).
array = newArray;
newArray = nullptr;

mklplo751
Grazie per la risposta, tuttavia ci era proprio vietato prendere un altro array.

apatriarca
L'unico modo per non allocare un nuovo array di dimensione opportuna è quella di aver già allocato abbastanza memoria nel primo array.

vict85
"mklplo":
Per quanto riguarda il secondo programma, non so come farlo nel senso che mi si richiede di prendere due vettori e SENZA usare un altro array d'appoggio di centrare il secondo nel primo (per esempio se $a=(1,2,3,4,5,6)$ e $b=(7,8)$ a dovrà essere $a=(1,2,3,7,8,4,5,6)$) il mio problema è come aumentare la dimensione di $a$ senza causare problemi, dato che se uso "new" l'indirizzo di memoria dovrebbe cambiare.
Se non vi reca disturbo, quando e se avete tempo, potreste aiutarmi?
Grazie per aver letto.


Non avevo letto questa parte. Come dice apatriarca basta che [inline]a[/inline] sia abbastanza grande da contenere entrambi. In pratica devi allocare \(a\) con la somma delle due dimensioni.

mklplo751
Ok, grazie a entrambi per aver risposto.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.