Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2009, 21:14   #1
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию Подводные камни в операции +=

Вообщем ерунда вот такая вот:

Имеется ссылочный массив int ** ; f[15][25] - адрес максимального элемента по обеим осям)


Эта штука даёт сегментатион фаулт если x превышает 14.
f[y += a][x += b] = 0;

//================================

Этот код всегда работает корректно.
y += a; x += b;
f[y][x] = 0;

Я не пойму в чём прикол???


P.S. пол дня на этот бред убил.
jojahti вне форума Ответить с цитированием
Старый 26.08.2009, 21:40   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

На таком проверил:
Код:
#include <iostream>
using namespace std;

int main()
{
int **f;
int x,y,i;
int a=2,b=3;

f = new int*[15];
for(i=0; i<15; i++)
 f[i] = new int[25];

x = y = 0;
while(y<15-a && x<25-b)
 {
  f[y+=a][x+=b]=0;
  cout<<y<<"  "<<x<<endl;
 }

for(i=0; i<15; i++)
 delete[] f[i];
delete[] f;   

cin.get();
}
Работает. Какие значения a и b у вас? и начальные значения x и y.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 26.08.2009, 21:40   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1. Что такое ссылочный массив? int **f - это объявление ссылочного массива? Как в таком случае выделяете память под элементы?
2. Какой компилятор?
3. Минимальный рабочий код с данной проблем получится повторить? Чтобы без всяких там приблуд, просто int main() и в ней работа с этим ссылочным массивом, чобы легко любой форумчанин у себя смог проверить. Такой, как Sazary привел постом выше. Если проблему повторить не удастся, значит проблема где-то в другом месте.

В любом случае вывод один: не надо экономить на строчках, ибо много граблей так обойти удастся, но проблема какая-то странная, что аж интересно
pu4koff вне форума Ответить с цитированием
Старый 27.08.2009, 14:25   #4
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Цитата:
2. Какой компилятор?
2. Собирал qmakerом. Ну а он собирал моком, g++ и ещё уиком.
3. Минимальный код? Ну блин, если-бы я знал, что там конкретно глючит.
Но выкидывает именно на этой строчке.

Может я так выложу?

myform.h
Цитата:
Код:
#ifndef MYFORM_H
#define MYFORM_H

#include <QMainWindow>
#include "ui_mainform.h"

class MyScene;
class MyForm : public QMainWindow, public Ui::MainWindow
{ Q_OBJECT
public:
 MyForm(QWidget *parent = 0);
private:
 MyScene *scene;
};
#endif
myform.cpp
Цитата:
[CODE]#include "myscene.h"
#include "myform.h"

MyForm::MyForm(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);
scene = new MyScene;
graphicsView->setScene(scene);
}
myscene.h
Цитата:
Код:
#ifndef MYSCENE_H
#define MYSCENE_H

#include <QGraphicsScene>

//extern int **f;

extern const int FY;
extern const int FX;

//-----------------------------
struct creatureXY   // creatures XY
    { int px;
      int py;
       creatureXY(); };
//-----------------------------
class MyScene : public QGraphicsScene
{ Q_OBJECT
 public:
  MyScene(QObject *parent=0);
//========   processor    =======
  void initRand();   // init field
  void discharge(); // discharge field
  void move(int, int);     //
//======== draw functions  ======
  void crWall(int,  int);
  void crJevel(int, int);

  void crPacman();
  void crMedved();
  
  void mvPacman(int, int);
  
  void dlJevel(int, int);
//===============================
 protected:
   virtual void keyPressEvent(QKeyEvent *keyEvent);
 private:
   creatureXY creXY;
   int **f;              // inside massive
   QGraphicsItem *s[15][25];              // massive the element of scene 
// QGraphicsItem **s;
   QGraphicsItem *pacman;
   QGraphicsItem *medved;
};
#endif
myscene.cpp
Цитата:
Код:
#include <iostream>
using namespace std;

#include <QGraphicsItem>
#include <QtCore>
#include <QKeyEvent>
#include "myscene.h"

//int **f;

const int FY=15;
const int FX=25;

MyScene::MyScene(QObject *parent) : QGraphicsScene(parent)
{
//======================||
 int **a = new int*[FY];//
 for(int i=0;i<FY;++i)  //
     a[i] = new int[FX];//
//======================||
                  f = a;// init global field;
//-----------------------
//=======================
cout << "!!! !!!";
initRand();
discharge();
}

void MyScene::keyPressEvent(QKeyEvent *keyEvent)
{
switch (keyEvent->key()) {
  case Qt::Key_Up    : move( 0,  1); break;  // X Y
  case Qt::Key_Right : move( 1,  0); break;
  case Qt::Key_Down  : move( 0, -1); break;
  case Qt::Key_Left  : move( -1, 0); break; }

}

//========== DRAW FUNCTIONS  =============

void MyScene::crWall(int x, int y)
{
 QGraphicsItem *item;
 item = addRect(10, 10, 20, 20);
// s[y][x] = item;
 item->translate(-500 +(x*20), 300 - (y*20));
}

void MyScene::crJevel(int x, int y)
{
 QGraphicsItem *item;
 item = addEllipse(15, 15, 10, 10);
 s[y][x] = item;
 item->translate(-500 +(x*20), 300 - (y*20));
}

void MyScene::crPacman()
{
 pacman = addEllipse(10, 10, 20, 20);
 pacman->setPos(-500 +(2*20), 300 - (2*20));
}

void MyScene::crMedved()
{
// medved = addEllipse(15, 15, 10, 10);
// medved->translate(-500 +(x*20), 300 - (y*20));
}

void MyScene::mvPacman(int x, int y)
{
 pacman->setPos(-500 +(x*20), 300 - (y*20));
}

void MyScene::dlJevel(int y, int x)
{
 cout << y << ",  " << x << endl;
 
 removeItem(s[y][x]);
}

Последний раз редактировалось jojahti; 27.08.2009 в 14:31.
jojahti вне форума Ответить с цитированием
Старый 27.08.2009, 14:25   #5
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

paclib.cpp
Цитата:
Код:
#include <iostream>
using namespace std;

#include <cstdlib>
#include <stdlib.h>
#include <time.h>

#include "myscene.h"

extern const int FY;
extern const int FX;

//=============== consructor  ===================
  creatureXY::creatureXY() : px(2), py(2)
                               {/*    */}
//===============================================
//==============   initRand()    ================
//===============================================
void MyScene::initRand()
{
//==================== | fill wall |
srand(time(0));
    cout << "!! ! !!";
  for(int y=0;y < FY; ++y)
  { cout << "! !"; { for(int x=0;x<FX;++x)
                       f[y][x] = 2; cout << "!"; } }
//================================ |
   for(int y=(FY-2); y > 0; --y)     // | fill field | for(int y=1; y < (FY - 1); ++y) 
   for(int x=1;x<(FX-1);++x)
                   switch(rand() % 6)
                    {case 5  : f[y][x] = 2; break;
                     case 4  : f[y][x] = 3; break;
                     default : f[y][x] = 0; break;}   //!!!
//=================================================
for(int y =1; y<4; ++y)            // | clear corner |
 for(int x=1; x<6; ++x)
                 f[y][x] = 0;

for(int y =(FY-2); y>(FY-5); --y)
 for(int x=(FX-2); x>(FX-7); --x)
                 f[y][x] = 0;
//=================================================
}

void MyScene::discharge()
{

for(int y=0;y<FY;++y)
  {for(int x=0;x<FX;++x){ 
    switch(f[y][x])
      { case 0 : /* cout << ' ';  */ break;
        case 2 :  crWall(x, y);  break;
        case 3 :  crJevel(x, y); break;
        case 5 : /* cout << 'P';  */ break;  }
                    /*cout<<'\n'; */            
 }    crPacman();           }
}

void MyScene::move(int x, int y)
{  cout << "y: " << creXY.py << ", x: " << creXY.px << endl;
  switch(f[creXY.py+y][creXY.px+x])   // Y X
     { case 2 : break;
       case 3 : f[creXY.px +=x][creXY.py += y] = 0; 
                /* creXY.px +=x; creXY.py += y;  f[creXY.py][creXY.px]=0; */
                                  /* mvPacman(creXY.px, creXY.py);  dlJevel(creXY.py, creXY.px); */ break;       
       case 0 : creXY.px +=x; creXY.py += y;
                                       mvPacman(creXY.px, creXY.py);     break; }
}

Последний раз редактировалось jojahti; 27.08.2009 в 14:30.
jojahti вне форума Ответить с цитированием
Старый 27.08.2009, 21:44   #6
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Глючит только в линуховском g++.
jojahti вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исследования Операции Европеец Помощь студентам 1 09.07.2009 04:41
Операции с формой Shouldercannon Общие вопросы Delphi 1 06.11.2008 14:53
Поразрядные операции eds Общие вопросы C/C++ 1 30.10.2008 10:29
Побитовые операции WinterLord Общие вопросы C/C++ 1 12.10.2008 22:39
Операции с датами. mrtnt PHP 3 20.09.2008 01:16