Wstawianie wartości do macierzy (tablicy) z zewnątrz funkcji

0

Siemka, mam problem ze wstawieniem wartości do tablicy dynamicznej (która ma postać macierzy). Moim celem jest wprowadzenie do konkretnego miejsca w macierzy wartości podanej przez użytkownika (również koordynaty mają być podane przez użytkownika). Za to ma odpowiadać funkcja m_put. Zrobiłem ją tak, żeby użytkownik wprowadzał wartości (tj. koordynaty i nową wartość dla danego miejsca) wewnątrz funkcji, to znaczy w funkcji użyłem printfa i scanfa. Taka funkcja działała poprawnie, jednak niestety za późno zorientowałem się, że wartości muszą być wprowadzone z zewnątrz (przekazywane do funkcji, bez scanfa i printfa), no i tutaj pojawiły się schodki, ponieważ funkcja jest gotowa, natomiast nie działa poprawnie, wszystkie zmienne przekazywane są poprawnie (sprawdzałem, funkcja wypisywała je poprawnie), jednak nie wprowadza nowej wartości do macierzy w wyznaczonym miejscu. Czy mógłby mi ktoś wskazać błąd i go poprawić? Byłbym bardzo wdzięczny :)
Oto kody:
(Główny program, wywołuje także inne funkcje, one działają poprawnie, jednak mnie w tym momencie interesuje m_put2)

#include <stdio.h>
#include <stdlib.h>
#include "MACIERZ_S.h"
#include "m_create.c"
#include "m_scanf.c"
#include "m_printf.c"
#include "m_get.c"
#include "m_put2.c"
#include "m_remove.c"


int main () {
	struct MACIERZ_S M;
	scanf ("%d %d", &M.x, &M.y);
	printf ("\n%d %d", M.x, M.y);
	m_create (&M);
	m_scanf (&M);
	m_printf (&M);
	int a,b,w; /* Tu zaczyna się pobieranie wartości do funkci m_put2 */
	printf ("Podaj koordynaty zmiennej, ktora chcesz zmienic\n");
	scanf ("%d %d", &a, &b);
	printf ("Podaj wartosc: ");
	scanf ("%d", &w);
	m_put2 (&M,a,b,w);
	m_printf (&M);
	printf ("%d ", m_get(&M,1,1));
	printf ("\nCzyszcze macierz...\n");
	m_remove (&M);
	printf ("Sprawdzam, czy macierz jest wyczyszczona...\n");
	printf ("%d ", m_get(&M,1,1));
	return 0;
}

(m_put2)

#include "MACIERZ_S.h"
#include "stdio.h"


int m_put2 (struct MACIERZ_S *MACIERZ, int a, int b, int wart) {
	printf ("%d %d %d\n", a, b,  wart);
	if (( a > (*MACIERZ).x) || ( b > (*MACIERZ).y ))
		return -1;
	else 
		wart = (*MACIERZ).wsk[(*MACIERZ).y*(a-1)+(b-1)]; /* mam wrażenie, że jest to błąd merytoryczny */
	return 0;
}

(Struktura MACIERZ_S)

#ifndef _MACIERZ_S_H
#define _MACIERZ_S_H

struct MACIERZ_S { 
	int x;	//rozmiar - szerokosc 
	int y;	//rozmiar - wysokosc
	int *wsk;	// "tablica" x na y
};

void m_create (struct MACIERZ_S *MACIERZ);
int m_remove (struct MACIERZ_S *MACIERZ);

int m_get (struct MACIERZ_S *MACIERZ, int a, int b);

#endif /* MACIERZ_S.h */

Wstawię także funkcje m_create i m_printf dla ułatwienia

void m_printf (struct MACIERZ_S *MACIERZ) {
    for(i=0; i<(*MACIERZ).x ; i++) {
        for(j=0; j<(*MACIERZ).y ; j++) {
       		printf("%d ", (*MACIERZ).wsk[(*MACIERZ).y*i+j]);
       		if (j == (*MACIERZ).y - 1)
				printf ("\n");
        }
	}
	return;	
}
void m_create(struct MACIERZ_S *MACIERZ) {
	printf("%d %d", (*MACIERZ).x, (*MACIERZ).y);
    (*MACIERZ).wsk=malloc((*MACIERZ).y*(*MACIERZ).x*sizeof(int)); 
	return;
}

Pozdro :)

PS Szczęśliwego nowego roku!

0

Tak dla potomnych :)
Wywaliłem się na kompletnej głupocie. Po kilku godzinach zastanawiania się, jak zrobić to zadanie, zauważyłem dziecinny błąd:
wart = (*MACIERZ).wsk[(MACIERZ).y(a-1)+(b-1)];
Od początku obstawiałem, że w tym miejscu się znajduje, jednak źle go zdiagnozowałem. Myślałem, że działanie jest niepoprawne, tymczasem powinno to wyglądać tak:
(*MACIERZ).wsk[(MACIERZ).y(a-1)+(b-1)] = wart;
Trochę głupio się czuję, że nie zauważyłem tak trywialnej rzeczy, że wartość zmieniana powinna być po lewej stronie XD
Miłego wieczoru :)

2

Czemu nie używasz operatora ->?
Czy coś takiego nie wygląda lepiej:

MACIERZ->wsk[MACIERZ->y * (a - 1) + (b - 1)] = wart;

Naucz się powszechnie przyjętych standardów kodowania. Jest ich kilka, ale w zasadzie wszystkie:

  1. Tylko makra powinny być samymi dużymi literami
  2. zmienne/argumenty funkcji z małej litery camel case/pascal case. Np: jakasZmienna albo jakas_zmienna
  3. funkcje camel case/pascal case zaczynając zawsze od małej lub dużej litery (główna różnica miedzy różnymi standardami kodowania).

Pisz tylko po angielsku, mieszanka polski/angielski jest najgorszą z możliwości.

Kod powinien używać indeksów informatycznych, czyli od 0, a nie od 1. Cześć od odpowiedzialna z a UI powinna robić poprawki, dla zwykłych ludzi :).

Jak na początkującego super (zakładając, że to w 100% twój kod). Robisz parę dziwnych rzeczy, ale widać, że potrafisz organizować kod w logiczny sposób i abstrakcyjne myślenie nie jest dla ciebie problemem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1