合并排序错误 - 表达式必须具有常量值

时间:2018-03-05 00:52:12

标签: c++

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
#include <vector>

using namespace std;

void merge(int A[], int p, int q, int r) {
    int i;
    int j;
    int k;
    int n1 = q - p + 1;
    int n2 = r - q;
    vector<int> L(n1), R(n2);
    for (i = 0; i < n1; i++)
        L[i] = A[p + i - 1];
    for (j = 0; j < n2; j++)
        R[j] = A[q + j];
    i = 1;
    j = 1;
    for (k = p ; k < r; k++) {
        if (L[i] <= R[j]) {
            A[k] = L[i];
            i++;
        }else{
            A[k] = R[j];
            j++;
        }
    }   
}
void merges(int A[], int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        merges(A, p, q);
        merges(A, q + 1, r);
        merge(A, p, q, r);
     }
}
void prin(int A[], int n) {
     int j;
     for (j = 0; j < n; j++)
        printf("%d ", A[j]);
     printf("\n");
}
int main(){
    fstream infile;
    infile.open("number.txt");
    if (infile.is_open()) {
        int i;
        int A[20];
        int n = sizeof(A) / sizeof(*A);
        int p = 0;
        for (int i = 0; i < n; i++) {
            infile >> A[i];
        }
        for (int j = 0; j < n; j++) {
            if (A[j] > p)
                p = A[j];
        }
        merges(A, 0, n);
        prin(A, n); 
    }
    return 0;
}

我用int L [n1],R [n2];得到了这个合并排序程序。 Visual Studio给我“表达必须具有恒定的价值”。我不知道该怎么做。我也尝试使用矢量,但得到了“表达式:矢量下标超出范围”错误。文本文件中的数字是20个随机数,从5到900未分类。关于如何放置的任何指针都有一个非常数的数组大小?

旁注:我将数组int main设置为20,因为我知道该文件有20个数字。有没有办法设置文件的数组大小我不知道它将包含多少个值?

2 个答案:

答案 0 :(得分:1)

您不必预先分配您的矢量。你可以继续添加东西,直到你完成。

int main()
{
    std::ifstream file;
    file.open("TextFile1.txt");
    std::string str;
    std::vector< std::string > strs;
    for( ; std::getline( file, str ); )
        strs.push_back( str );

    std::cout << "the number of entries: " << strs.size( ) << std::endl;
    return 0;
}

请注意,std::vector size()是从文件中读取的内容。

已添加:当您开始使用标准库中的内容use this site时,看看您可以使用std :: vector之类的内容。它解释了push_backsize以及所有其他成员以及功能概述。

戴维斯勒指出。养成不使用标准库using namespace的习惯。这是不值得的。谷歌在stackoverflow上的更多信息。

答案 1 :(得分:0)

除非它们是编译时已知的常量,否则不能将n1n2用作C ++中的数组边界。如果它们是constexpr变量,这将有效。

在C中,这些表达式将声明可变长度数组,这是一个可选功能。