IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Помогите найти ошибку, C++
Rocket
сообщение 19.10.2008 21:51
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


У меня есть массив: mas=21213140404040. Хочу получить из него следующий массив: m1= 223140. Счётчик "cnt" не инкрементируется. В чём причина?
 #include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
char mas[16];

void ToDisplay()
{ char m[16],m1[8];
  int cnt=0, b= 0, x,i,j=0;
  
  for (i=0; i<16; i++)
   m[i]=(int)mas[i];
   
     for (i=0; i<16; i+=2)
      { 
       
        x=(int)m[i];
    
       while(j<16)
        {
          cout<<x<<endl;  
          cout<<(int)m[j]<<endl;
          cout<<(int)m[j+1]<<endl;
          if ((m[j]==x)&&(m[j+1]==1))
          {             
                       cnt++; // <--- !!!
                          cout<<"Cnt = "<<cnt<<endl;
                          break;
          }
                
        j+=2;
       }
      
        m1[b]=x;
        m1[b+1]=cnt;
        b+=2;
        cnt=0;
     }
       
     for (i=0; i<8; i++)  
     {
                  cout<<(int)m1[i]<<" ";
     }
     cout<<endl;   
        
getch();
     
     }
     
int main()
{
  mas[0]=2;
  mas[1]=1;
  mas[2]=2;
  mas[3]=1;
  mas[4]=3;
  mas[5]=1;
  mas[6]=3;
  mas[7]=0;
  mas[8]=4;
  mas[9]=0;
  mas[10]=4;
  mas[11]=0;
  mas[12]=4;
  mas[13]=0;
  mas[14]=4;
  mas[15]=0;
  
  for(int i=0;i<16;i++)
                {
                  cout<<(int)mas[i]<<" ";
                }
  cout<<endl;
  
  ToDisplay();   
   getch();
    }

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
volvo
сообщение 19.10.2008 22:22
Сообщение #2


Гость






Все увеличивается, до тех пор, как
       while(j<16)
       {
          cout<<x<<endl;  
          cout<<(int)m[j]<<endl;
          cout<<(int)m[j+1]<<endl;
          if ((m[j]==x)&&(m[j+1]==1))
          {             
                       cnt++;
                          cout<<"Cnt = "<<cnt<<endl;
                          break;
          }
                
        j+=2;
       }
      
       m1[b]=x; // <--- Здесь b = 8, и все остальное уже неважно - 
       m1[b+1]=cnt;
       b+=2;
       cnt=0;
     }
, поскольку
Цитата
19/10/2008 21:26:21 started a CodeGuard™ process: Project1.exe
Access overrun in process: Project1.exe(2084) - File1.cpp
Attempt to access 1 byte(s) at 0x0012FF60+8, that is at offset 0+8 in local block 0x0012FF60(=[ebp-0x14]
@Project1.exe:0x01:00035B) which is only 8 bytes long.


Сообщение отредактировано: volvo - 19.10.2008 22:23
 К началу страницы 
+ Ответить 
Rocket
сообщение 19.10.2008 22:34
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 19.10.2008 23:22) *

Все увеличивается, до тех пор, как
       while(j<16)
       {
          cout<<x<<endl;  
          cout<<(int)m[j]<<endl;
          cout<<(int)m[j+1]<<endl;
          if ((m[j]==x)&&(m[j+1]==1))
          {             
                       cnt++;
                          cout<<"Cnt = "<<cnt<<endl;
                          break;
          }
                
        j+=2;
       }
      
       m1[b]=x; // <--- Здесь b = 8, и все остальное уже неважно - 
       m1[b+1]=cnt;
       b+=2;
       cnt=0;
     }
, поскольку

А как это исправить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.10.2008 23:34
Сообщение #4


Гость






Ты в следующий раз говори, по какому алгоритму это все делается, и заодно приводи в программу те данные, которые заявлены в самом посте...

Я бы делал так:
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
char mas[14] = {
	2, 1, 2, 1, 3, 1, 4, 0, 4, 0, 4, 0, 4, 0
};

void ToDisplay()
{
	char m[14], m1[8] = {0};
	int cnt=0, b = 0, x, i, j=0;

	for (i=0; i<14; i++) {
		m[i] = (int)mas[i];
	}

	for (i=0; i<14; ) {
		x = (int)m[i];
		int curr_cnt = (int)m[i+1];

		j = i;
		while((j < 14) && (m[j]==x && m[j+1]==curr_cnt)) {
			cnt++;
			cout << "Cnt = " << cnt << endl;
			j += 2;
		}

		cout << x << endl;
		m1[b++] = x;
		m1[b++] = cnt * curr_cnt;

		i += 2*cnt;
		cnt = 0;
	 }

	 for (i=0; i<8; i++) {
		cout << (int)m1[i] << " ";
	 }
	 cout << endl;
	 getch();
}

int main()
{
	for(int i = 0; i < 14; i++)	{
		cout << (int)mas[i] << " ";
	}
	cout << endl;

	ToDisplay();
	getch();

	return 0;
}
 К началу страницы 
+ Ответить 
Rocket
сообщение 19.10.2008 23:37
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вообще мне нужно сделать следующее:
дан массив, к примеру, 21002100310000004000000000000000. Нужно вывести следующее:
Блоки по 4 байта : 2 (то есть 21002100)
Блоки по 8 байт : 1 (то есть 31000000)
Блоки по 16 байт : 0 (то есть 4000000000000000).
Как это реализовать более рационально?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 29.07.2025 8:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"