Zamiana wierszy w tablicy dwuwymiarowej

Odpowiedz Nowy wątek
2017-03-20 21:58
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;
}
 

To forum jest bez humoru :) lubisz grejpfruta?
edytowany 2x, ostatnio: furious programming, 2017-03-20 22:02

Pozostało 580 znaków

2017-03-20 22:04
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.


.

Pozostało 580 znaków

2017-03-20 22:08
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


To forum jest bez humoru :) lubisz grejpfruta?

Pozostało 580 znaków

2017-03-20 22:20
0

Adresy w statycznej tablicy?


.

Pozostało 580 znaków

2017-03-20 22:24
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;
}

To forum jest bez humoru :) lubisz grejpfruta?

Pozostało 580 znaków

2017-03-20 23:06
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;
 
}
 

Pozostało 580 znaków

2017-03-20 23:13
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


To forum jest bez humoru :) lubisz grejpfruta?
edytowany 1x, ostatnio: bartek164, 2017-03-20 23:36

Pozostało 580 znaków

2017-03-20 23:43
0

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

Powodzenia z gwiazdkami i dwuelem. ;-)

Ja już widzę jak avatar kolegi @bartek164 powoli siwieje :-) Jak przetrwa to będzie weteranem wskaźników :-> - Mokrowski 2017-03-20 23:50
ja to zrozumiem i zrobie oczywiście - bartek164 2017-03-20 23:55

Pozostało 580 znaków

2017-03-20 23:55
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


To forum jest bez humoru :) lubisz grejpfruta?
edytowany 1x, ostatnio: bartek164, 2017-03-21 00:02

Pozostało 580 znaków

2017-03-21 00:11
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.

edytowany 2x, ostatnio: wujnia, 2017-03-21 00:28
no ja to rozumiem, i rozumieałem ale nie o to chodzi...., to jak napisać zamiane wierszy, - bartek164 2017-03-21 00:22
nie tak, tak to nawet ja umiem, przy użyciu wskażników i bez zmiany poszczególnych wartosci , takue jest zadanie - bartek164 2017-03-21 00:37
Ostatni raz wrzuce choć poziom dezinformacji ze strony kolegi przekroczył już chyba granice krytyczną. - wujnia 2017-03-21 00:54

Pozostało 580 znaków

2017-03-21 01:55
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;
 
}
 

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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