簡體   English   中英

合並排序錯誤 - 表達式必須具有常量值

[英]Merge sort error - Expression must have a constant value

#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 給了我“表達式必須具有恆定值”。 我不知道該怎么做。 我也嘗試使用向量,但出現“表達式:向量下標超出范圍”錯誤。 文本文件中的數字是從 5 到 900 未排序的 20 個隨機數。 關於如何放置數組大小的任何指針都有一個非常數?

旁注:我將數組 int main 設置為 20,因為我知道該文件有 20 個數字。 有沒有辦法為文件設置數組大小,我不知道其中有多少個值?

您不必預先分配您的向量。 您可以繼續添加內容,直到完成。

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()是從文件中讀取的內容。

補充:當你開始使用標准庫中的東西時,使用這個站點來看看你可以用 std::vector 做些什么。 它解釋了push_backsize以及所有其他成員以及功能概述。

正如戴維斯洛指出的那樣。 養成不using namespace與標准庫一起using namespace的習慣。 這是不值得的。 在 stackoverflow 上谷歌一下以獲取更多信息。

你不能在 C++ 中使用n1n2作為數組邊界,除非它們是編譯時已知的常量。 如果它們是constexpr變量,這將起作用。

在 C 中,這些表達式將聲明可變長度數組,這是一項可選功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM