• ベストアンサー

メモリ領域を

char s[65536]; char s0[65536]; と大きなWindowsプログラムの中で宣言するとプログラムのコンパイルはとおり実行もほとんど問題ないのですが メインウィンドウのサイズ変更をしようとするとエラーになります そこで char s[999]; char s0[999]; と宣言を変更すると全く問題無く動きます メモリ領域を大きく使えるような設定とかあるのでしょうか? OSはWin98でコンパイラはBorland C++5.51でAPIかつ非統合環境で組んでいます

質問者が選んだベストアンサー

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

> メモリ領域を大きく使えるような設定とかあるのでしょうか? スタックサイズを大きくする、ということすれば大きなローカル変数を確保することができます。 Borland C++5.51は詳しくないですが、 コンパイラかリンカのオプションで指定できるのではないかと思います。

keyguy
質問者

お礼

ありがとうございます 今回はとりあえず容量を下げる事で切りぬけようと思いますがスタックを増やさないと行けないときには設定しようと思います

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

こ、これは…よく初心者がやる間違い…。 関数内で自動変数が宣言されたとき、たいていのC/C++コンパイラはその関数が呼び出された時点でスタック領域と呼ばれる領域にその変数の実体を確保しようとします。 しかし、このスタック領域は結構狭いので、このような大容量を自動変数として宣言すると容量オーバーで止まってしまいます。これはコンパイル時には認識されないエラーの一つです。 解決策は、大容量のメモリ領域が必要な場合は、Cの場合はmalloc()、C++の場合はnewを使って領域を確保する、ということです。この領域を使い終わったときにはfree()/deleteで開放することを忘れないでください。

keyguy
質問者

お礼

ありがとうございます しかし65.536kB×2程度で1MBより遥かに小さい容量で個のような自体に陥るとはまだDOS時代のまずいOS設計の影響を受けているのでしょうか? 32BIT化のときに直していないとはがっかりしますね

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • malloc領域から関数ポインタ型で呼び出し

    現在C言語で,関数ポインタ型による関数の呼び出しを勉強しています. print()という関数は受け取った文字列を表示するだけの関数ですが, これを通常の関数ポインタを用いて実行したのがmain内の(*mem)("FROM POINTER.");です. これに対して後半は,mallocで確保した領域にmemcpyでprint()をコピーし, (*mem)("FROM COPIED AREA.");で実行しています. 実行環境は以下の通りです. OS:Windows7 Personal 32bit CPU:Intel Core i5 M430 統合開発環境:Visual C++ 2010 Express Edition コンパイルには成功しています. 実行すると"FROM POINTER."は表示されるのですが, "FROM COPIED AREA."は表示されず,プログラムが動作を停止してしまいます. mem = (void (*)(char*))tmp;までは実行できているようですが, (*mem)("FROM COPIED AREA.");の実行の時点で停止しているようです. またコマンドプロンプトからBorland C++ 5.5.1でコンパイルしても, 同じように動作が停止してしまいます. ただし同じプログラムでも,Cygwinからgccでコンパイルすると, 意図した通りの挙動となっていることを確認しています. コンパイラの違いによるものなのか, UNIXとWindowsの違いによるものなのか判断できずにいます. (もしくはライブラリのmalloc,memcpy辺りの実装法の違いでしょうか?) どなたかご存知でしょうか. ----------------------------------------- #include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 512 void print(char* str){ printf("%s\n", str); } int main(int argc, char** argv){ void (*mem)(char*); void *tmp; mem = &print; (*mem)("FROM POINTER."); tmp = malloc(SIZE); memcpy(tmp, print, SIZE); mem = (void (*)(char*))tmp; (*mem)("FROM COPIED AREA."); }

  • windowsコンパイラ

    windows API32のプログラムを行いたいのですが、コンパイラは何を使えばいいのですか? コンパイラは  Borland C++ BuilderX Personal(フリーのヤツ) を使っています。 このコンパイラでプログラミングできるでしょうか? 出来るとしたら、設定方法を教えてください

  • Cpad for Borland C++Compiler を使っている方に質問です。

    上にある「実行」をクリックすると、一番下に「設定(s)」が現れ、そこをクリックすると設定画面が現れます。 そこで「コンパイラのパス」と「ヘルプファイルのパス」を入力したいんですが、このパス(パスワードの略?)って、どこを参照すればわかりますか? パソコンが本当に苦手で、苦労してCpad for Borland C++Compilerをインストールしたのですが、プログラムを入力して「コンパイル&実行」ボタンを押したら「コンパイラ""が見つかりません」と出ました。多分、「コンパイラのパス」が入力できればプログラムは実行できるんじゃないかと思います。

  • アセンブラでのメモリの動的確保について

    自作コンパイラのために最近NASMを使ってアセンブラの勉強を始めたものです。 メモリ領域の確保のためにNASMでは buffer: resb 64 と宣言しますが、C++でのchar* buffer=new char[size]; のような、動的なメモリ領域の確保の記述は可能でしょうか? 普段はC++を主に使っているため、見当違いな質問かもしれませんが、よろしくお願いします。

  • プログラム領域の算出方法

    現在C言語でプログラミングの勉強(設計含む)をしているのですが、設計書の記載項目に「プログラム領域」「ヒープ領域」「スタック領域」の算出を関数ごとに行うというような記述がありました。 動的メモリ領域・スタック領域の算出方法は何とか調べたのですが、「プログラム領域」の算出方法がわかりません! 出来れば 1.プログラム全体のプログラム領域の算出方法 2.関数ごとのプログラム領域の算出方法 を教えて頂けないでしょうか? 勉強している環境 OS:WindowsXP コンパイラ:Borland C++ Compiler 5.5 よろしくお願い致します。

  • CとJavaはどのくらいスピードが違うの?

    BorlandのJBuilderなど、Javaもネイティブコードコンパイラがありますよね。質問ですが、 (1) UNIXで動くJavaのネイティブコードコンパイラで優秀なものはあるのでしょうか。 (2) C言語でコンパイルしたプログラムとJavaでネイティブコードコンパイルしたプログラムは、どのくらい速度に差があるのでしょうか? たとえば、Visual Basicも最近のバージョンはネイティブコードコンパイルができますが、C言語で作った同じ論理構造のプログラムに比べて、やはり、かなり実行速度が劣ります。

  • NULL領域を読み書きするの意味が?

    C言語の初学者です。 コンパイラは、Borland C++ 5.5.1 for Win32 を使っています。 たまたま見つけた C magazine プログラミングの禁じ手Web版 C言語編で、「NULL領域を読み書きする」という個所があり、下記ソースで発覚すると掲載されていました。 (http://www.cmagazine.jp/src/kinjite/c/null.html#index5) void f() { static char *theTxt; strcpy(theTxt,"TEST\n"); printf("%s",theTxt); } 自分の環境で、下記のソースで動かしてみたところ、アプリケーションエラーになりました。 #include <stdio.h> #include <string.h> int main(void) { static char *theTxt; /* (1) */ strcpy(theTxt,"TEST\n"); printf("%s",theTxt); return 0; } この禁じ手の意味そのものが、全く理解できませんでした。 ・NULL領域というのは、(1)のstatic定義されたポインタことをさしているのか? ・(1)の static をつけないで実行すると、正常終了したので、static の領域に書き込んではいけないのか? (そんなことはないと思うのだが)

  • グローバル変数とメモリについて

    質問させてもらいます。 #include <stdio.h> #include <math.h> #include M 1000 double a[M][M]; のようにプログラム冒頭にグローバル変数として配列aを宣言しているのですが、windowsXPではMを4096以上にして保存し、コンパイル(BCC)すると Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland beki4.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: Error detected (LME1514) Fatal: Error detected (LME1514) Fatal: Error detected (LME1514) Fatal: Error detected (LME1514) と出て、コンパイルができません。4095では可能でした。 最初はメモリの不足かと思ったのですが、単純に計算すると4096*4096*8 byteで、この配列には約134MB程度しかかかりません。メインメモリが1GBでその他OSなどが消費しているメモリは500MB程度なのでメモリ不足では無いような気がします。 同じプログラムをfedora8でメインメモリ1GBのPCでやらせてみた所、M=16383まではコンパイル(gcc)でき、16384以上では「too large」と言われてコンパイルできませんでした。 それぞれのOSでのMの設定値の限界が4095(=2^12-1),16383(=2^14-1)となっていまして、これはそれぞれのOSで一つの変数が占有できるメモリの限界を定めているということを意味しているのでしょうか? またこのような限度がOSにあった場合、その設定を変更する方法はありますか? よろしくお願いします。 実際のプログラム→http://cocofox.konjiki.jp/beki.html(文字数制限の関係上ここにすべてのcodeを記載できないため)

  • eclipseのコンパイルエラーについて

    現在、Eclipse+borlandでdirectxのプログラムを作成しています。 しかし、eclipseでコンパイルをするとコンソールに ”プログラムが大きすぎてメモリに入りません”とエラーが 表示されます。 borlandでコンパイルをすると問題なく実行ファイルが生成されます。 eclipseでコンパイルする場合は、設定が必要なのでしょうか?

  • コンパイラの制限 : ヒープの領域を使い果たしました

    最近、標準C++の勉強を始めたばかりなのですが、以前にC++で書いたプログラムのヘッダを標準C++に変更して(例えば、#include<iostream.h>を#include<iostream>に変える)コンパイルしたところ、 「コンパイラの制限 : ヒープの領域を使い果たしました; 上限を設定するために /Zm オプションを使用してください。」とのエラーがでました。このエラーは以前は出なかったもので、以前も今回もコンパイラーはVC++6.0です。なぜ、ヘッダを変えただけでこのようなエラーが出たのでしょうか。漠然とした質問で答えようがないかもしれませんが、ご存知の方いらっしゃったら教えてください。お願いします。

このQ&Aのポイント
  • 日向坂46のライブW-KEYAKIFES.2021の配信予定について調査しました。
  • 日向坂46のW-KEYAKIFES.2021が配信されるかどうか気になる方も多いようです。
  • ひかりTVのサービスやISPぷららと関連して日向坂46のW-KEYAKIFES.2021の配信についてお知りになりたいようです。
回答を見る