Неопределенные ошибки с массивами в с ++?

В основном мы пытаемся сделать массивы доступными по нерегулярным индексам с помощью этого нового объекта IntArray, у нас есть пара файлов заголовков и .cpp, посмотрите:

 //intarray.h
 #ifndef _IntArray_H
 #define _IntArray_H


 #include <iostream>
 #include <string>
 using namespace std;


class IntArray {

public:

IntArray(int n);
IntArray(int a, int b);
IntArray();
IntArray(const IntArray& copyarray);



int low();
int high();
void setName(string n);
int *array;
int size;

void operator+=(IntArray&);
int& operator[](int x);
IntArray& operator=(IntArray&);
int operator!=(IntArray&);
int operator==(IntArray&);
friend ostream& operator<<(ostream&, const IntArray&);
friend IntArray operator+(IntArray& a, IntArray& b);
 private:
 //PRIVATE DATA MEMBERS
 int lo, hi;
 string name;


};


#endif

Вот следующий файл, еще один файл заголовка

    // iadrv.h

 #ifndef _IADRV_H
 #define _IADRV_H

 #include "intarray.h"

 int main();
 void test1();
 void test2();

void test3();
void test4();
void test5();
void test6();
void test7();
void test8();
void test9();
void test10();
void test11();
void test12();
void test13();
void test14();
void test15();
void test16();
void test17();
void test18();
void test19();
void test20();
void wait();

#endif

и, наконец, вот два файла .cpp

//intarray.cpp
#include <iostream>
#include <fstream>
#include "IntArray.h"
#include <string>
extern ofstream csis;
using namespace std;



IntArray::IntArray() {
    size = 10;
    array = new int[size];
    lo = 0;
    hi = (size - 1);
}

IntArray::IntArray(int n) {

    array = new int[n];
    lo = 0;
    hi = n - 1;
    size = n;

}

IntArray::IntArray(int a, int b) {


    if (b > a) {

        size = (b - a) + 1;
        array = new int[size];
        lo = a;
        hi = b;
    }
    if (b == a) {
        size = 1;
        array = new int[size];
        lo = a;
        hi = b;
    }
    else if (a > b) {
        cout << "-ERROR: First argument cannot be larger than second argument. Program Halted-" << endl;
    }



}

IntArray::IntArray(const IntArray& copyarray) {

    IntArray::lo = copyarray.lo;
    IntArray::hi = copyarray.hi;
    IntArray::size = copyarray.size;

    array = new int[size];




    for (int i = lo; i <= hi; i++) {
        array[i] = copyarray.array[i];
    }


}



ostream& operator<<(ostream& ostr, const IntArray& target)
{
    int offset = target.lo;


        for (int i = target.lo; i <= target.hi; i++) {
            ostr << target.name << "[" << i << "] = " << target.array[i] << endl;
        }

    return ostr;
}






void IntArray::operator+=(IntArray& target)
{

    int* p1 = (target.array + target.lo);

    if ((hi - lo) != (target.hi - target.lo)) {
        cout << "-ERROR: For +=, both elements must have same # of elements. Program Halted-" << endl;
        csis << "-ERROR: For +=, both elements must have same # of elements. Program Halted-" << endl;
    }
    else {
        for (int i = lo; i <= hi; i++) {
            array[i] = *(p1 + i) + *(array + i);
        }
    }
}





IntArray operator+(IntArray& tar1, IntArray& tar2)
{
    IntArray sum(tar1.size);

    int* p1, *p2;

    p1 = (tar1.array + tar1.lo);
    p2 = (tar2.array + tar2.lo);

    if (!(tar1.size == tar2.size)) {
        cout << "-ERROR: To use +, must have same # of elements. Program Halted-" << endl << endl;
        csis << "-ERROR: To use +, must have same # of elements. Program Halted-" << endl << endl;
    }
    else {
        for (int i = 0; i <= sum.size; i++) {
            sum.array[i] = *(p1 + i) + *(p2 + i);
        }
    }
    return IntArray(sum);
}














int& IntArray::operator[](int x)
{





    /**
    if (x < lo) {
        cout << "-ERROR: Not in range. Program Halt-" << endl << endl;
        csis << "-ERROR: Not in range. Program Halt-" << endl << endl;
    }
    if (x > hi) {
        cout << "-ERROR: Not in range. Program Halt-" << endl << endl;
        csis << "-ERROR: Not in range. Program Halt-" << endl << endl;
    }

    */

    return array[x];
}








int IntArray::operator!=(IntArray& target)
{

    int difference = target.lo - IntArray::lo;
    int check = 1;

    if ((size) == (target.size)) {

        for (int i = lo; i <= hi; i++) {

            if (array[i] == target.array[i + difference]) {
                check--;
            }

        }
    }
    else if (size != target.size) {
        return check;
    }

    if (check < 0) {
        check = 0;
    }

    return check;
}


















int IntArray::operator==(IntArray& target)
{

    int check = 0;
    int difference = target.lo - IntArray::lo;



    if (size == target.size) {

        for (int i = lo; i <= hi; i++) {

            if (array[i] == target.array[i + difference]) {
                check++;
            }

        }

    }
    else if (!(size == target.size)) {
        return 0;
    }



    if (check > 0) {
        check = 1;
    }

    return check;
}










IntArray& IntArray::operator=(IntArray& target)
{

    int difference = target.lo - IntArray::lo;



    if (size != target.size) {
        cout << "ERROR: Invalid assigment of two different sized arrays" << endl << endl << endl;
        csis << "ERROR: Invalid assigment of two different sized arrays" << endl << endl << endl;
    }

    for (int i = IntArray::lo; i <= IntArray::hi; i++) {
        array[i] = target.array[i + difference];
    }

    return *this;
}







void IntArray::setName(string n) {
    IntArray::name = n;
}

int IntArray::low() {
    return lo;
}


int IntArray::high() {
    return hi;
}

Это файл .cpp с основным

// iadrv.cpp - driver program for testing IntArray class

#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include "iadrv.h"

using namespace std;

ofstream csis;

int main() {
    csis.open("csis.txt");
    test1();
    test2();
    test3();
    /**
    test4();
    test5();
    test6();
    test7();
    test8();
    test9();
    test10();
    test11();
    test12();
    test13();
    test14();
    test15();
    test16();
    test17();
    test18();
    test19();
    test20();
    */
    csis.close();
}

void test1() {
    cout << "1. Array declared with single integer: IntArray a(10);" << endl << endl;
    csis << "1. Array declared with single integer: IntArray a(10);" << endl << endl;
    IntArray a(10);
    for (int i = a.low(); i <= a.high(); i++)
        a[i] = i * 10;
    a.setName("a");
    cout << a << endl;
    csis << a << endl;
    wait();
}

void test2() {
    cout << "2. Array declared with two integers: IntArray b(-3, 6);" << endl << endl;
    csis << "2. Array declared with two integers: IntArray b(-3, 6);" << endl << endl;
    IntArray b(-3, 6);


    for (int i = b.low(); i <= b.high(); i++)
        b[i] = i * 10;
    b.setName("b");
    cout << b << endl;
    csis << b << endl;
    wait();
}

void test3() {
    cout << "3. Array declared with two integers: IntArray c(6, 8);" << endl << endl;
    csis << "3. Array declared with two integers: IntArray c(6, 8);" << endl << endl;
    IntArray c(6, 8);
    cout << c.low() << endl;
    cout << c.high() << endl;

    for (int i = c.low(); i <= c.high(); i++) {
        c[i] = i * 10;
        cout << c[i] << " " << i << endl;
    }


    c.setName("c");
    cout << c << endl;
    csis << c << endl;
    wait();
}

void test4() {
    cout << "4. Array declared with two identical integers: IntArray d(5, 5);" << endl << endl;
    csis << "4. Array declared with two identical integers: IntArray d(5, 5);" << endl << endl;
    IntArray d(5, 5);
    for (int i = d.low(); i <= d.high(); i++)
        d[i] = i * 10;
    d.setName("d");
    cout << d << endl;
    csis << d << endl;
    wait();
}

void test5() {
    cout << "5. Array declared with no integers: IntArray z;" << endl << endl;
    csis << "5. Array declared with no integers: IntArray z;" << endl << endl;
    IntArray z;
    for (int i = z.low(); i <= z.high(); i++)
        z[i] = i * 10;
    z.setName("z");
    cout << z << endl;
    csis << z << endl;
    wait();
}

void test6() {
    cout << "6. Array declared with another object of type IntArray: IntArray c(6, 8);" << endl;
    cout << "                                                        Intarray e(c);" << endl << endl;
    csis << "6. Array declared with another object of type IntArray: IntArray c(6, 8);" << endl;
    csis << "                                                        Intarray e(c);" << endl << endl;
    IntArray c(6, 8);
    for (int i = c.low(); i <= c.high(); i++)
        c[i] = i * 10;
    c.setName("c");
    cout << c << endl;
    csis << c << endl;
    IntArray e(c);
    e.setName("e");
    cout << e << endl;
    csis << e << endl;
    wait();
}

void test7() {
    cout << "7. Array assigned to another array w/ different indices: IntArray f(1, 4);" << endl;
    cout << "                                                         IntArray g(5, 8);" << endl;
    cout << "                                                         f = g;" << endl << endl;
    csis << "7. Array assigned to another array w/ different indices: IntArray f(1, 4);" << endl;
    csis << "                                                         IntArray g(5, 8);" << endl;
    csis << "                                                         f = g;" << endl << endl;
    IntArray f(1, 4);
    for (int i = f.low(); i <= f.high(); i++)
        f[i] = i * 10;
    f.setName("f");
    cout << f << endl;
    csis << f << endl;
    IntArray g(5, 8);
    for (int i = g.low(); i <= g.high(); i++)
        g[i] = i * 10;
    g.setName("g");
    cout << g << endl;
    csis << g << endl;
    wait();
    f = g;
    cout << f << endl;
    cout << g << endl;
    csis << f << endl;
    csis << g << endl;
    wait();
}

void test8() {
    cout << "8. Multiple array assignment with different indices: IntArray j(3, 6);" << endl;
    cout << "                                                     IntArray k(6, 9);" << endl;
    cout << "                                                     IntArray l(1, 4);" << endl;
    cout << "                                                     j = k = l;" << endl << endl;

    csis << "8. Multiple array assignment with different indices: IntArray j(3, 6);" << endl;
    csis << "                                                     IntArray k(6, 9);" << endl;
    csis << "                                                     IntArray l(1, 4);" << endl;
    csis << "                                                     j = k = l;" << endl << endl;
    IntArray j(3, 6);
    for (int i = j.low(); i <= j.high(); i++)
        j[i] = i * 10;
    j.setName("j");
    cout << j << endl;
    csis << j << endl;
    IntArray k(6, 9);
    for (int i = k.low(); i <= k.high(); i++)
        k[i] = i * 10;
    k.setName("k");
    cout << k << endl;
    csis << k << endl;
    IntArray l(1, 4);
    for (int i = l.low(); i <= l.high(); i++)
        l[i] = i * 10;
    l.setName("l");
    cout << l << endl;
    csis << l << endl;
    wait();
    j = k = l;
    cout << j << endl;
    cout << k << endl;
    cout << l << endl;
    csis << j << endl;
    csis << k << endl;
    csis << l << endl;
    wait();
}

void test9() {
    cout << "9. Overloaded equality operator (identical elements): IntArray m(3, 7);" << endl;
    cout << "                                                      IntArray n(1, 5);" << endl;
    cout << "                                                      m == n" << endl << endl;
    csis << "9. Overloaded equality operator (identical elements): IntArray m(3, 7);" << endl;
    csis << "                                                      IntArray n(1, 5);" << endl;
    csis << "                                                      m == n" << endl << endl;
    IntArray m(3, 7);
    for (int i = m.low(); i <= m.high(); i++)
        m[i] = i * 10;
    m.setName("m");
    cout << m << endl;
    csis << m << endl;
    IntArray n(1, 5);
    for (int i = n.low(); i <= n.high(); i++)
        n[i] = i * 10;
    n.setName("n");
    cout << n << endl;
    csis << n << endl;
    wait();

    m = n;
    cout << m << endl;
    cout << n << endl;
    cout << "Returns " << (m == n ? "True." : "False.") << endl << endl;
    csis << m << endl;
    csis << n << endl;
    csis << "Returns " << (m == n ? "True." : "False.") << endl << endl;
    wait();
}

void test10() {
    cout << "10. Overloaded equality operator (different elements): IntArray o(3, 7);" << endl;
    cout << "                                                       IntArray p(1, 5);" << endl;
    cout << "                                                       o == p" << endl << endl;
    csis << "10. Overloaded equality operator (different elements): IntArray o(3, 7);" << endl;
    csis << "                                                       IntArray p(1, 5);" << endl;
    csis << "                                                       o == p" << endl << endl;
    IntArray o(3, 7);
    for (int i = o.low(); i <= o.high(); i++)
        o[i] = i * 10;
    o.setName("o");
    cout << o << endl;
    csis << o << endl;
    IntArray p(1, 5);
    for (int i = p.low(); i <= p.high(); i++)
        p[i] = i * 10;
    p.setName("p");
    cout << p << endl;
    cout << "Returns " << (o == p ? "True." : "False.") << endl << endl;
    csis << p << endl;
    csis << "Returns " << (o == p ? "True." : "False.") << endl << endl;
    wait();
}

void test11() {
    cout << "11. Overloaded equality operator (different size arrays): IntArray q(1, 3);" << endl;
    cout << "                                                          IntArray r(1, 4);" << endl;
    cout << "                                                          q == r;" << endl << endl;
    csis << "11. Overloaded equality operator (different size arrays): IntArray q(1, 3);" << endl;
    csis << "                                                          IntArray r(1, 4);" << endl;
    csis << "                                                          q == r;" << endl << endl;
    IntArray q(1, 3);
    for (int i = q.low(); i <= q.high(); i++)
        q[i] = i * 10;
    q.setName("q");
    cout << q << endl;
    csis << q << endl;
    IntArray r(1, 4);
    for (int i = r.low(); i <= r.high(); i++)
        r[i] = i * 10;
    r.setName("r");
    cout << r << endl;
    cout << "Returns " << (q == r ? "True." : "False.") << endl << endl;
    csis << r << endl;
    csis << "Returns " << (q == r ? "True." : "False.") << endl << endl;
    wait();
}

void test12() {
    cout << "12. Overloaded inequality operator (identical elements): IntArray s(3, 7);" << endl;
    cout << "                                                         IntArray t(1, 5);" << endl;
    cout << "                                                         s != t;" << endl << endl;
    csis << "12. Overloaded inequality operator (identical elements): IntArray s(3, 7);" << endl;
    csis << "                                                         IntArray t(1, 5);" << endl;
    csis << "                                                         s != t;" << endl << endl;
    IntArray s(3, 7);
    for (int i = s.low(); i <= s.high(); i++)
        s[i] = i * 10;
    s.setName("s");
    cout << s << endl;
    csis << s << endl;
    IntArray t(1, 5);
    for (int i = t.low(); i <= t.high(); i++)
        t[i] = i * 10;
    t.setName("t");
    cout << t << endl;
    csis << t << endl;
    wait();
    s = t;
    cout << s << endl;
    cout << t << endl;
    cout << "Returns " << (s != t ? "True." : "False.") << endl << endl;
    csis << s << endl;
    csis << t << endl;
    csis << "Returns " << (s != t ? "True." : "False.") << endl << endl;
    wait();
}

void test13() {
    cout << "13. Overloaded inequality operator (different elements): IntArray u(3, 7);" << endl;
    cout << "                                                         IntArray v(1, 5);" << endl;
    cout << "                                                         u != v;" << endl << endl;
    csis << "13. Overloaded inequality operator (different elements): IntArray u(3, 7);" << endl;
    csis << "                                                         IntArray v(1, 5);" << endl;
    csis << "                                                         u != v;" << endl << endl;
    IntArray u(3, 7);
    for (int i = u.low(); i <= u.high(); i++)
        u[i] = i * 10;
    u.setName("u");
    cout << u << endl;
    csis << u << endl;
    IntArray v(1, 5);
    for (int i = v.low(); i <= v.high(); i++)
        v[i] = i * 10;
    v.setName("v");
    cout << v << endl;
    cout << "Returns " << (u != v ? "True." : "False.") << endl << endl;
    csis << v << endl;
    csis << "Returns " << (u != v ? "True." : "False.") << endl << endl;
    wait();
}

void test14() {
    cout << "14. Overloaded inequality operator (different size arrays): IntArray w(1, 3);" << endl;
    cout << "                                           IntArray x(1, 4);" << endl;
    cout << "                                           w != x;" << endl << endl;
    csis << "14. Overloaded inequality operator (different size arrays): IntArray w(1, 3);" << endl;
    csis << "                                           IntArray x(1, 4);" << endl;
    csis << "                                           w != x;" << endl << endl;
    IntArray w(1, 3);
    for (int i = w.low(); i <= w.high(); i++)
        w[i] = i * 10;
    w.setName("w");
    cout << w << endl;
    csis << w << endl;
    IntArray x(1, 4);
    for (int i = x.low(); i <= x.high(); i++)
        x[i] = i * 10;
    x.setName("x");
    cout << x << endl;
    cout << "Returns " << (w != x ? "True." : "False.") << endl << endl;
    csis << x << endl;
    csis << "Returns " << (w != x ? "True." : "False.") << endl << endl;
    wait();
}

void test15() {
    cout << "15. Sum of two arrays assigned to third array: IntArray a(1, 5);" << endl;
    cout << "                                               IntArray b(4, 8);" << endl;
    cout << "                                               IntArray c = a + b;" << endl << endl;
    csis << "15. Sum of two arrays assigned to third array: IntArray a(1, 5);" << endl;
    csis << "                                               IntArray b(4, 8);" << endl;
    csis << "                                               IntArray c = a + b;" << endl << endl;
    IntArray a(1, 5);
    for (int i = a.low(); i <= a.high(); i++)
        a[i] = i * 10;
    a.setName("a");
    cout << a << endl;
    csis << a << endl;
    IntArray b(4, 8);
    for (int i = b.low(); i <= b.high(); i++)
        b[i] = i * 10;
    b.setName("b");
    cout << b << endl;
    csis << b << endl;
    wait();
    IntArray c = a + b;
    c.setName("c");
    cout << c << endl;
    csis << c << endl;
    wait();
}

void test16() {
    cout << "16. Sum of two arrays assigned to first array: IntArray d(10, 13);" << endl;
    cout << "                                               IntArray e(30, 33);" << endl;
    cout << "                                               d += e;" << endl << endl;
    csis << "16. Sum of two arrays assigned to first array: IntArray d(10, 13);" << endl;
    csis << "                                               IntArray e(30, 33);" << endl;
    csis << "                                               d += e;" << endl << endl;
    IntArray d(10, 13);
    for (int i = d.low(); i <= d.high(); i++)
        d[i] = i * 10;
    d.setName("d");
    cout << d << endl;
    csis << d << endl;
    IntArray e(30, 33);
    for (int i = e.low(); i <= e.high(); i++)
        e[i] = i * 10;
    e.setName("e");
    cout << e << endl;
    csis << e << endl;
    d += e;
    cout << d << endl;
    csis << d << endl;
    wait();
}

void test17() {
    cout << "17. Array declared with illegal array bounds: IntArray f(5, 2);" << endl << endl;
    csis << "17. Array declared with illegal array bounds: IntArray f(5, 2);" << endl << endl;
    IntArray f(5, 2);
    for (int i = f.low(); i <= f.high(); i++)
        f[i] = i * 10;
    f.setName("f");
    cout << f << endl;
    csis << f << endl;
    wait();
}

void test18() {
    cout << "18. Array with index out of range: IntArray g(10);" << endl;
    cout << "                                   g[10] = 1;" << endl << endl;
    csis << "18. Array with index out of range: IntArray g(10);" << endl;
    csis << "                                   g[10] = 1;" << endl << endl;
    IntArray g(10);
    for (int i = g.low(); i <= g.high(); i++)
        g[i] = i * 10;
    g.setName("g");
    cout << g << endl;
    csis << g << endl;
    g[10] = 1;
    wait();
}

void test19() {
    cout << "19. Arrays with length mismatch: IntArray m(1, 4);" << endl;
    cout << "                                 IntArray n(2, 4);" << endl;
    cout << "                                 m = n;" << endl << endl;
    csis << "19. Arrays with length mismatch: IntArray m(1, 4);" << endl;
    csis << "                                 IntArray n(2, 4);" << endl;
    csis << "                                 m = n;" << endl << endl;
    IntArray m(1, 4);
    for (int i = m.low(); i <= m.high(); i++)
        m[i] = i * 10;
    m.setName("m");
    cout << m << endl;
    csis << m << endl;
    IntArray n(2, 4);
    for (int i = n.low(); i <= n.high(); i++)
        n[i] = i * 10;
    n.setName("n");
    cout << n << endl;
    csis << n << endl;
    wait();
    m = n;
    cout << m << endl;
    cout << n << endl;
    csis << m << endl;
    csis << n << endl;
    wait();
}

void test20() {
    cout << "20. Array subscript operator: IntArray o(7, 8);" << endl;
    cout << "                              o[7] = 25;" << endl;
    cout << "                              o[8] = o[7];" << endl << endl;
    csis << "20. Array subscript operator: IntArray o(7, 8);" << endl;
    csis << "                              o[7] = 25;" << endl;
    csis << "                              o[8] = o[7];" << endl << endl;
    IntArray o(7, 8);
    for (int i = o.low(); i <= o.high(); i++)
        o[i] = i * 10;
    o.setName("o");
    cout << o << endl;
    csis << o << endl;
    o[7] = 25;
    o[8] = o[7];
    cout << o << endl;
    csis << o << endl;
    wait();
}

void wait() {
    char buf;

    cout << "Press any key to continue." << endl;
    cin.get(buf);
}

Проблема в том, что когда я пытаюсь запустить и скомпилировать в test3 (), ИНОГДА он будет выводить правильно, но в других случаях я перестрою решение, и оно выдаст значения мусора, несмотря на то, что у него такой же код. Это очень странно, и я не могу понять, почему он это делает

Добро пожаловать в Stack Overflow! Пожалуйста, редактировать ваш вопрос с минимальный воспроизводимый пример или SSCCE (короткий, автономный, правильный пример)

NathanOliver 30.07.2018 21:49
IntArray::operator[] не принимает во внимание смещение IntArray::lo, поэтому вы обращаетесь к элементам, выходящим за границы - неопределенное поведение.
G.M. 30.07.2018 22:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
130
1

Ответы 1

Рассмотрим test2 и то, что происходит, когда вы получаете доступ к b [-3]

особенно ваша реализация int& IntArray::operator[](int x), где вы делаете

int& IntArray::operator[](int x)
{
    return array[x];
}

вы возвращаете ссылку на фиктивную память. (Int, который находится на 3 места до начала вашего выделенного массива)

Измените свой код следующим образом:

return array[x-lo];

Да, кстати, используйте std :: vector.

Другие вопросы по теме