|
Динамический массив
#38562187
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Здравствуйте, несколько дней не получается решить проблему, помогите. Задание: Вставить в один Array другой в определенное место. Ошибка в моем коде на втором пробеге. m_size не соответствует. Помогите пожалуйста чтоб код заработал
SmartBuffer.cpp
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118.
#include"stdafx.h"
#include"SmartBuffer.h"
#include<iostream>
#include <assert.h>
SmartBuffer::SmartBuffer( int maxSz, char *iniArray, int iniArraySize)
{
const int MIN_BUF_SIZE = 5;
m_size = 0; // Size von Array definieren
m_maxSize = (maxSz < MIN_BUF_SIZE ? MIN_BUF_SIZE : maxSz); // if maxSz ist < als sz dann MaxSize = größter von zwei
m_buff = new char[m_maxSize];
////////////////////////////////
if(iniArray) // Elementen definieren in Konstruktor //
{
//was, wenn m_maxSize < iniArraySize????
for (int i = 0; i<iniArraySize; i++)
m_buff[i] = iniArray[i];
}
}
SmartBuffer::~SmartBuffer(void)
{
delete[] m_buff;
}
void SmartBuffer::IncreaseSize(int newSize)
{
m_maxSize = m_size + newSize; // Neue größe von m_buff
char *newArray = new char[m_maxSize]; // Neue Array erstellen
for(int i = 0; i<m_size; i++)
{
newArray[i]= m_buff[i] ; // Kopie von Elementen
}
delete [] m_buff;
m_buff = newArray;
}
void SmartBuffer::Add(unsigned char _ch)
{
const int DELTA_RESIZE = 10;
if( m_size == m_maxSize)
{
m_maxSize = m_size + DELTA_RESIZE; // Neue größe von m_buff
char *newArray = new char[m_maxSize]; // Neue Array erstellen
for(int i = 0; i<m_size; i++)
{
newArray[i]= m_buff[i] ; // Kopie von Elementen
}
delete [] m_buff;
m_buff = newArray;
}
m_buff[m_size] = _ch; // Element einfügen am Ende Array
m_size ++;
}
char SmartBuffer::getAtPos(int p)
{
if (p>=m_size||p<0)
throw out_of_range("p index ist out of range");
else
return m_buff[p];
}
int SmartBuffer::GetSize()
{
return m_size-1; // letzte Element in Array
}
void SmartBuffer::RemoveAtPos(int p)
{
if (p>=m_size||p<0) // Überprüfung ob Position in gültige Bereich ist
throw out_of_range("p index ist out of range");
else
for(int i = p; i<m_size; i++) // von p bis Ende
{
m_buff[i] = m_buff[i+1]; // Verschiebung nach links
}
m_buff[m_size-1] = 0; // Letzte position auf 0
m_size--; // Size um 1 verkleinern
}
void SmartBuffer::InsertAtPos(int p, char c)
{
if (p>=m_size||p<0) // Überprüfung ob Position in gültige Bereich ist
throw out_of_range("p index ist out of range");
if(m_size==m_maxSize) // wenn Array zu klein
{
IncreaseSize(m_size+1); // Array vergrößern
}
else
{
for(int i = m_size; i>p ; i--) // Rückwerts bis Position
{
m_buff[i] = m_buff[i-1]; // Verschiebung nach rechts
}
m_buff[p] = c; // Einfügen char in Position
/*assert(m_buff[1]=='p');*/
}
}
void SmartBuffer::InsertArrayAtPos(int p, char* buff, int s2)
{
if (p>m_size||p<0) // Überprüfung ob Position in gültige Bereich ist
throw out_of_range("p index ist out of range");
if(m_maxSize < m_size + s2) // Wenn Array zu klein, dann um s2(größe von buff) vergrößern
IncreaseSize(s2);
for (int j=m_size; j>=p && m_size != 0; j--) //j von index 4 bis 2 m_buff
{
m_buff[j] = m_buff[j+s2]; // Verschiebung 0 nach 4
}
for(int i = 0; i<=s2; i++) //Externe buff index {0,1,2}
{
m_buff[p] = *(buff+i); // in m_buff speichern buff von p=2 Inhalt{100,101,102}
p++; // position m_buff verschieben
m_size++;
}
}
SpecherDan.cpp
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
// SpeicherDynam.cpp : Definiert den Einstiegspunkt fьr die Konsolenanwendung.
#include "stdafx.h"
#include"SmartBuffer.h"
#include <assert.h>
#include<iostream>
int main()
{
SmartBuffer sb(15);
char pB[] = {0,1,2,3};
const int bsz = 4;
SmartBuffer sb2;
for(int i = 0; i < 10; i++)
{
sb2.InsertArrayAtPos(i, pB, bsz);
assert((i+1)* bsz == sb2.GetSize());
}
return 0;
}
|
|
|