• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WEBカメラの動画制御を動的配列で、、)

動的配列を使用してWEBカメラの動画制御を行う方法

ibe_tattsuの回答

  • ベストアンサー
回答No.3

> あと例外の原因の位置を特定するに当たり、0x0364b640というアドレスは特定できるのでしょうか? > それともよりよい方法があるのでしょうか? 開発環境にもよるのですが、たぶんWindowsですよね? VisualStudioをお使いだと思うのですが、デバッグモードで例外が発生したらその位置でプログラムが停止し、発生した位置にカーソルが移動したりしませんか? (UNIXやCygwinならgdbというデバッガを使えます。) アドレスも何からかの形で使えるかもしれませんが、私はこちらの方が便利なのでアドレスは気にしていません。 それにデバッガを使用すると、関数の呼び出し関係を見てみたり、ブレークポイントを設定したり、動作中にちょこっと停止させて変数の中身を確認したり変更できます。 WEBカメラをお使いとのことなので、別にDLLをお使いでしょうか? DLL内の関数で例外が発生しているようであれば、その関数を呼び出すまでに何かおかしなことをしていないか、動作を細かく解析してみてはいかがでしょうか? > ・GOTO文の使用を避けてみます。 補足ですが、今回のようなループの脱出ならbreak文が該当します。 二重ループの脱出ならばgotoを使うのも手の一つだといわれています。

rairarai
質問者

お礼

ありがとうございます。デバッガを見たところ、DLL内を指しているため、やはりメインのソースで起こっているみたいです。 ソースの改善はまだ手をつけておりませんが、 ご指摘いただいた箇所は修正かけてみます。 それでも解決できない場合はまたご相談させてください。

関連するQ&A

  • 続 仮想メモリの制御

    昨日 http://oshiete1.goo.ne.jp/qa3665270.html で質問させていただいた者です。 沢山の方に多様なアドバイス頂き感謝しております。 さて当方のメモリ使用量に関しまして、調査したところ、 初めの行列の宣言がメモリを食いまくっていることが発覚しました。 そこでグローバルで ------------------- #define FRAMES 1000 #define WX 640 #define WY 480 int arraya[FRAMES][WX*WY]; --------------- の配列を宣言すると 普通に計算すると1000×640×480×4=約1.2GB になるため、さすがに大きすぎると思い、 ------------------- #define FRAMES 300 #define WX 320 #define WY 240 int arraya[FRAMES][WX*WY]; --------------- 約92.16MBにしても両方とも物理メモリ制限一杯の 1.3GBを消費してしまいます。 これはプログラム自体を実行する以前になってしまうため、 宣言自体に問題があるのかと思うのですが、 何か定義したり、設定したりしなければいけないのか、 もしくは、宣言する場所が不適切なのでしょうか? 開発ツールはVC++です。

  • 動画の遅延再生プログラム

    PCとPCカメラを使って、 10秒前後の遅延再生する簡易プログラムを 作りたいと思っております。 WEBカメラのドライバのフリーソフト EWCLIBを利用して、下記ソースまで 作ったのですが、高スペックなPCにも かかわらず、フレームレートが ばらつきます。 フレームレートは30にしており、 妥協して15にしても同様の 問題がおこるので、おそらくWindowsかカメラの 自動制御が悪さをしていると思われます。 当方試行錯誤したのですが、ついに行き詰りました。 ソースの改良、ハードの取替え、動作環境の 変更等対策がありましたらご教授願います。 ちなみに高価なものであれば、すでに同機能以上の ものが世の中にあるのは把握しておりますので、 なるべくなら、安価に仕上げれるものが 望ましいです。 #include <esplib.h> #include <ewclib.h> #pragma comment(lib, "winmm.lib") #include <crtdbg.h> #define FRAMES 60 #define WX 320 #define WY 240 float a=0,b=0,c=0; void ESP_Ready(void) { ESP_CreateImage(0,"000",0,0,WX,WY,400); ESP_OpenTextWindow(0,86,512,439,135); ESP_Printf("初期化中...\n"); int r= EWC_Open(WX,WY,15); if(r){ ESP_Printf("Error %d\n",r); return; } ESP_Printf("Startをクリックしてください.\n"); } void ESP_Main(void) { int w=0; int **latesc; latesc = new int*[FRAMES]; for(int i=0;i<FRAMES;i++){ latesc[i] = new int[WX*WY]; } for(;;){ a=timeGetTime(); CopyMemory(ESP_VramPtr[0],latesc[w],WX*WY*4); // フレームバッファを指定 ESP_Select(0); ESP_Update(); // 新しいフレームが来るまで待つ for(;;){ Sleep(1); if(EWC_IsCaptured(0)) break; } // フレーム番号 r の表示 c=timeGetTime(); b = c - a; ESP_Locate(0,5); ESP_Printf("ewc_time[0]= %f [s]\n",b); ESP_Locate(0,3); ESP_Printf("w=%03d\n",w); EWC_SetBuffer(0,latesc[w]); w=(w+1)%(FRAMES-1); //wには最後に書き込まれたフレームを指定する if(ESP_STOP) break; } for(int i=0;i<FRAMES;i++){ delete[] latesc[i]; } delete[] latesc; ESP_Printf("Stop\n"); } void ESP_Finish(void) { EWC_Close(); }

  • 大きな配列を使うには?

    BCCにJavaからポーティングしましたが、配列 int array[max]で、150000程度の大きさを超えると、メモリ不足で止まってしまいます。BCCかリンカのオプションで、ヒープやスタックサイズを変更する具体的な方法、または、大きな配列を上手く使う方法を教えてください。(プログラムはこんな感じ。) #define max_array 140000 /* このサイズを変更したい */ void main() { char array[max_array] ; この後、ヒープも使うのですが、(そのメモリ確保も必要)そこまで 行かない。。。。 (MSのVC++2005でも、同様になりました。) 10数年ぶりにプログラムをしている初心者です。 よろしくお願いします。

  • 4つの異なる二次配列を関数で表示

    二次配列と関数の問題です。 [日本語訳]displayArray7を呼ぶ関数を書きなさい。その関数は二次配列を一つの引数として受け取り、その内容を画面に表示すべきである。その関数は下のいずれの配列でも動作するようにしなさい。プログラムを書いてその関数を評価しなさい。 4つの配列とも一次の項(?)の数が違うじゃないですか。しかも関数を呼ぶときは配列[5][7]などはいらないですよね? (displayArray7(hours);だけ) だから、各配列の一次の項がどんな数字を持っているのかを関数displayArray7に送ることが出来ず、どのように表示してよいのか分かりません(今は一応最大値50で表示しています)。どのようにすればよいのでしょうか? 教えてください。お願いします。 #include <iostream> using namespace std; void initialize(int array[][7]); void displayArray7(int array[][7]); int main() { int hours[5][7]; int stamps[8][7]; int autos[12][7]; int cats[50][7]; initialize(hours); displayArray7(hours); initialize(stamps); displayArray7(stamps); initialize(autos); displayArray7(autos); initialize(cats); displayArray7(cats); return 0; } void initialize(int array[50][7]) { int i, j; for(i=0; i<50; i++) for(j=0; j<7; j++) array[i][j] = 0; } void displayArray7(int array[][7]) { int i, j; cout << "\t1\t2\t3\t4\t5\t6\t7" << endl << endl; for(i=0; i<50; i++){ cout << i+1 << ":"; for(j=0; j<7; j++){ cout << "\t" << array[i][j]; } cout << endl << endl; } }

  • 配列

    最後にもう一つだけお願いします。ずっと格闘しても解決できません・・ 配列の中の数字で、偶数を全て奇数の前にもって行きます 例) {1,0,1,0,0,1,1} → {0,0,0,1,1,1,1} {3,3,2} → {2,3,3} {2,2,2} → {2,2,2} 流れとしては、まず奇数の数を数えます。これは何回シフトするから知るためです。 配列0から奇数を探し、あればそれを一番最後の配列へとシフトします。 奇数を探す作業が一度終わっても、まだシフトさせないといけない奇数があるかもしれないので(奇数が連続で並んでる場合)、最初に数えた奇数の数分だけちゃんとシフトするようにしようと思います。 public void evensLeft(int[] array) { int odd=0; for (int i = 0; i < array.length; i++) { if(array[i]%2!=0) odd++; //奇数の個数 } while (odd>0) { //奇数分シフトするためのカウント for(int j=0;j<array.length;j++){ //奇数を探す if (array[j] % 2 != 0) { odd--; //奇数のカウントを1減らす for (int k = j; k < array.length-1; k++) { //その奇数を一番最後に移動 int temp = array[k+1]; array[k+1] = array[k]; array[k] = temp; } } } } return array; } いくつかの例では動くのですが、{3,3,2}の例だと配列0に3が来てしまいます。色々変えてみても結果無理でした・・・ どなたかご教授お願いします。

    • ベストアンサー
    • Java
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • Cで二次元配列の読み込み

    はじめまして。 hiraです。 今非常に基本的であろうことに悩んでいます。まだまだプログラムを始めたところなのでうまくいきません。 内容は・・・ あるファイルを読み込んで、二次元の配列に格納していく。 です。 具体的には test.txtというファイルがあり、中身は数字の二次元配列です。 カンマやtabで区切られています。配列の大きさ、数字の桁数などはファイルによって違います。 そのファイルを読み込んで、配列に格納したいと考えています。 今は一列を読み込むことには成功しています。そこからどのようにして分けて言ったらいいのか・・・ご教示お願いします。 もしくは、もっと違う方法で読み込む方法があればよろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char array[256]; char buf[256]; fin=fopen("test.txt","r"); if(fin == NULL){ printf("%sがオープンできません\n",fin); exit(1); } while(fgets(buf,256,fin) != NULL) {           ここが問題・・・ } fclose(fin); return 0; }

  • 一次元配列についてです

    配列matを以下の様に宣言し、連続した3つの数の和を順に書き出すプログラムを作成しています。が、条件式とprintfの出力の仕方が全く解りません。この二つが解る方、教えて頂けませんか。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { } printf("\n"); return(0); }

  • 配列の受け渡し

    全く原因が分からないので質問させていただきます. 次のようなプログラムがあります. メイン関数で配列を宣言して, これを関数funcに渡して,func内で処理を行う. その後,メイン関数でprintf()を使って配列の内容を表示させる. 私の書いたソースは次のようになっています. int main(void) { double data[]={1.0, 2.0, 3.0, 4.0}; for(i=0; i<4; i++) { printf("%f\n", data[i]); } func(data, 4); for(i=0; i<4; i++) { printf("%f\n", data[i]); } } void func(double *f, int n) { 配列に処理を行う } メイン関数の中で, 一つ目のprintf()はちゃんと配列dataの初期値を表示します. ところが,二つ目のprintf()の手前で, 「例外」とエラーがでてきます. (コンパイルは通っています.) これが何故なのか,さっぱり分かりません. 関数func()の最後にprintf()を書いてみたところ, ちゃんと処理を行った後の正しい値が表示されます. なので,関数func()自体にバグはないように思うのです. 原因が分かる方,いらっしゃいましたら, どうぞよろしくお願いします.

  • c言語 配列

    関数の中で複数の値を配列で返したいのですが,どうすればいいでしょう? 配列を関数に渡す時にはアドレスが渡されるので,ポインタと同様関数内で値を変えればmain関数の値も変わるのではないかと思ったのですが,上手くいきません. 知りたいのは,main関数の中の配列(できれば2次元配列)の値を他の関数から値を変更する方法です.下のプログラムはためしに書いてみたものです.質問を理解するうえで役立てば幸いです. #include<stdio.h> void func(double aaa[][3] ,double bbb[]); void main(void){ double array_a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; double array_b[3]={0}; func(array_a,array_b); } void func(double aaa[][3] ,double bbb[]) { int i,j; for (i=0;i<3;i++) { for (j=0;j<3;j++) { bbb[i]=bbb[i]+aaa[i][j]; } } }