Zamiana wierszy w tablicy dwuwymiarowej

0

czemu nie działa? requeired as left opernad of assingment

#include <stdio.h>
#define K 4
#define W 4

int change( int (*m)[K], int W1, int W2)
{
    int i,j, temp;
	for(j = 0; j < K; ++j)
	  {
	      (*m + W1) + i = temp;  // ogólnie taki wzór *(m + 0 ) + 0 ,  *(m + 0) + 1.....
	      (*m + W1) + i = *(*m + W2) + i;
	      (*m + W2) + i = temp;
	  }
	    return 0;
}


int main(void){

int m[W][K]={{3,5,1,4},{0,0,0,0},{9,9,1,9},{0,0,0,0}};
int i,j;
change(m,0,2);  //zamień wiersz 0 z 2
 for(i = 0; i < W; ++i)
	for(j = 0; j < K; ++j)
        printf("%3d", m[i]);

return 0;
}

1

Do poprawy:

*(*(m + W1) + i) = temp;

oraz:

printf("%3d", m[i][j]);//chyba

I błędy kompilatora (chyba znasz angielski):

prog.c: In function 'change':
prog.c:10:23: warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized]
           *(*(m + W1) + i) = temp;  // ogólnie taki wzór *(m + 0 ) + 0 ,  *(m + 0) + 1.....
                       ^
prog.c:10:28: warning: 'temp' may be used uninitialized in this function [-Wmaybe-uninitialized]
           *(*(m + W1) + i) = temp;  // ogólnie taki wzór *(m + 0 ) + 0 ,  *(m + 0) + 1.....

Pozdro 600.

0

wth. ja nie chce zmieniać wartośći tylko adresy. Nie rozumiem, jak będe miał ** to będe się odwoływał i zamieniał zmienne.hmmm

0

Adresy w statycznej tablicy?

0

no dobra poprawiłem, tak z 1 gwiazdką to było bez sensu,
teraz jak to zrobić z 1 gwiazdką, tj. jak zamienić wiersz po prostu 1 z 2, bo nie wiem jak to zrobić
gdzie umieścić tą gwiazdkę, i jak nawiasy wstawić

#include <stdio.h>
#define K 4
#define W 4

int change( int (*m)[K], int W1, int W2)
{
    int i;
    int temp;

          temp =  *(m + W1) + i;
	      *(m + W1) + i = *(m + W2) + i;
	      *(m + W2) + i = temp;

	    return 0;
}


int main(void){

int m[W][K]={{3,5,1,4},{0,0,0,0},{9,9,1,9},{0,0,0,0}};
int i,j;
change(m,0,2);
 for(i = 0; i < W; ++i)
	for(j = 0; j < K; ++j)
        printf("m[%d][%d]=%d\t", i, j, m[i][j]);

return 0;
}
0

Nie sprawdzałem czy się kompiluje ot ogólna idea.

#include <stdio.h>
#include <string.h>
#define K 4
#define W 4
 
void swap( int ( *const m )[K], const int w1, const int w2)
{
  
  int temp[K];
  memcpy( temp, m[w1], sizeof( temp ) );
  memcpy( m[w1], m[w2], sizeof( temp ) );
  memcpy( m[w2], temp, sizeof( temp ) );
  
}
 
int main( void )  {
 
  int m[W][K] = { {3,5,1,4}, {0,0,0,0}, {9,9,1,9}, {0,0,0,0} };

  swap( m, 0, 2);  //zamień wiersz 0 z 2

  for( int i = 0; i < W; ++i )  {
    
    for( int j = 0; j < K; ++j )   printf("%3d ", m[i][j]);

  }
  
  return 0;
  
}
 

0

nie, no coś ty ja chce to zmienić po prostu 2 wiersze w 1 tablicy
to raczej niewymaga niczego szczególnego, i bez funkcji wbudowanych

dowiedziałem się, że jeśli jako argument funkcji (przekazujać tablice dwuelem.)
mam change( int *W ....) to wtedy moge się poruszać jakby liniowo

a jeśli podam (*p)[4] to co się dzieje, jak próbowałem użyć jednej gwiazdki aby zmienić wiersze to wyskakuje bład, ale przecież , o co chodzi, chciałem zmienić adresy, dlatego 1 gwiazdka

0

Po to są te funkcje żeby ich używać.

Powodzenia z gwiazdkami i dwuelem. ;-)

0

'Napisz funkcję, która zamienia dwa wskazane wiersze tablicy
dwuwymiarowej - nie zamieniaj poszczególnych elementów w wierszach,
wykorzystaj wskaźniki.' to jest proste zadanie, tylko ja nie rozumiem, wskażników jeżeli mam do dyspozycji takie wyrażenie int (*p)[N] bo nie rozumiem, między inymi jak się nimi posługiwać, no przecież jedna gwiazdka wskazuje na adres, 2 wartości ,a bez gwiazdki omg. też adres

0

omg omg

Kolego.

int (* a)[5] to adres wskazujący na tablicę 5 elementowych intów.
zaś int *a[5] to tablica pięciu pointerów/adresów int.

jak masz int (* a)[5];

5 twoje kolumny
posługujesz się tak:
a[ wiersze ][ kolumny ];

Musisz tak pisac bo twoja macierz a[5][5] po przekazaniu do funkcji decayuje nie wiem jak to po polsku by się tłumaczyło.
zmienia się na ptr do pierwszego elementu.
A ten element to tablica 5 intów.

EDIT ???
Skoro dzidzia rozumie to czemu nie umie?

void swap( int ( *const m )[K], const int w1, const int w2)
{

  int temp;
  for( int i = 0; i < K; i++ )  {

    temp = m[w1][i];
    m[w1][i] = m[w2][i];
    m[w2][i] = temp;

  }
  
}

facepalm.

0

wyrazaj sie jasniej nastpenym razem o co ci chodzi.

#include <stdio.h>
#include <string.h>
#define K 4
#define W 4
 
void swap( int *m[W], const int w1, const int w2)  {

  int *temp = m[w1];
  m[w1] = m[w2];
  m[w2] = temp;
  
}

int main( void )  {

  int *m[W] = { (int[K]){ 3, 5, 1, 4 }, (int[K]){ 0, 0, 0, 0 },
		(int[K]){ 9, 2, 4, 8 }, (int[K]){ 0, 0, 0, 0 } };
 
   swap( m, 0, 2);  //zamień wiersz 0 z 2
 
  for( int i = 0; i < W; ++i )  {
 
    for( int j = 0; j < K; ++j )   printf("%d", m[i][j]);
    puts("");
 
  }
 
  return 0;

}


0

a coś tak rozbił tą tablicę, i czy nie mogła ona być statyczna

 int *m[W]
0

Ze względu na bełkotliwy opis zadania w Kolegi wykonaniu tak zrobiłem.

0

int *m[W], co to jest za zapis i co on oznacza wargumencie funkcji

0

tablica pointerów.

W sumie powinno się napisać int **tab bo to i tak zdecayuje ( nie znam polskiego słowa a angielskie chyba też źle pisze ).

0

poczytałem, i już wiele więcej wiem, wiem oprócz jednego błedu pisze w kodzie

#include <stdio.h>
#define K 4
#define W 3

void swap(int* m[W], const int w1, const int w2)
{

    int* temp = *(m + w1);
    *(m + w1) = *(m + w2);
    *(m + w2) = temp;
}

int main(void)
{

    int n[][K] = { { 3, 5, 1, 4 }, { 0, 0, 0, 0 }, { 9, 2, 4, 8 } };
    int* m[W];
    int j, i;
    for (i = 0; i < 3; ++i)
      *( m + i) = *(n + i);  //dlaczego musze tutaj dać gwiazdkę w *(n + i) , jeśli nie dam to pisze że brakuje operatora
  //*( m + i) = (n + i);   - >requaired operand ale przecież adres 2 wiersza to n+2 a nie *(n+2)

    swap(m, 1, 2);

    int* p;                      //to jest do ćwiczeń
    p = n + 1;               // a tutaj sobie wpisałem n+1 jako 2 wiersz i działa
    for (i = 0; i < K; i++)
        printf("%3d", p[i]);

    printf("\n\n");
    for (i = 0; i < W; i++)
        for (j = 0; j < K; j++)
            printf("%3d", m[i][j]);

    return 0;
}
0

wróć, spoczko, już działa, nie wiem dlaczego wtedy nie działało

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