質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

受付中

C# *ポインタがのenumにアドレスのenumが設定できない原因が知りたい。

samidare_chan
samidare_chan

総合スコア278

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

4回答

0リアクション

0クリップ

445閲覧

投稿2022/07/22 12:03

編集2022/07/25 00:16

提示コードの//ここで例外部の行で以下のエラーが発生するのですがこれは何が原因なのでしょうか?同じ状況を再現した実験コードを書きましたが問題なくコンパイルできます。

参考サイト: https://ufcpp.net/study/csharp/sp_unsafe.html#abst

Error
System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'
実験コード

cs

using System; public class Program { enum Status { AAA, BBB } public static void Main() { unsafe { Status status; Status* t; t = &status; } } }
問題のソースコード

cs

using FFmpeg.AutoGen; internal unsafe class Program { static int Main(string[] args) { AVFrame* frame; AVPacket* pkt; int i, j, k, ret; short* samples; float t, tincr; if (args.Length <= 0) { string executable = Environment.GetCommandLineArgs()[0]; //Console.Error.WriteLine($"Usage: {executable} <output file>"); //return 0; } var filename = "input.flac"; /* find the MP2 encoder */ AVCodec* codec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_MPEG4); if (codec == null) { Console.WriteLine("Codec not found"); return 1; } AVCodecContext* c = ffmpeg.avcodec_alloc_context3(codec); if (c == null) { Console.Error.WriteLine("Could not allocate audio codec context"); return 1; } /* put sample parameters */ c->bit_rate = 64000; /* check that the encoder supports s16 pcm input */ c->sample_fmt = AVSampleFormat.AV_SAMPLE_FMT_S16; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// AVSampleFormat av;//列挙型 av = AVSampleFormat.AV_SAMPLE_FMT_S16; //codec->sample_fmtsはAVSampleFormat型 codec->sample_fmts = &av; //ここで例外 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// *codec->sample_fmts = AVSampleFormat.AV_SAMPLE_FMT_S16; if (!check_sample_fmt(codec, c->sample_fmt)) { string sampleFormat = ffmpeg.av_get_sample_fmt_name(c->sample_fmt); Console.Error.WriteLine($"Encoder does not support sample format {sampleFormat}"); return 1; } /* select other audio parameters supported by the encoder */ c->sample_rate = select_sample_rate(codec); c->channel_layout = select_channel_layout(codec); c->channels = ffmpeg.av_get_channel_layout_nb_channels(c->channel_layout); /* open it */ if (ffmpeg.avcodec_open2(c, codec, null) < 0) { Console.Error.WriteLine($"Could not open codec"); return 1; } using BinaryWriter output = new BinaryWriter(new FileStream(filename, FileMode.Create)); /* packet for holding encoded output */ pkt = ffmpeg.av_packet_alloc(); if (pkt == null) { Console.Error.WriteLine($"could not allocate the packet"); return 1; } /* frame containing input raw audio */ frame = ffmpeg.av_frame_alloc(); if (frame == null) { Console.Error.WriteLine($"Could not allocate audio frame"); return 1; } frame->nb_samples = c->frame_size; frame->format = (int)c->sample_fmt; frame->channel_layout = c->channel_layout; /* allocate the data buffers */ ret = ffmpeg.av_frame_get_buffer(frame, 0); if (ret < 0) { Console.Error.WriteLine($"Could not allocate audio data buffers"); return 1; } /* encode a single tone sound */ t = 0.0f; tincr = (float)(2 * Math.PI * 440.0 / c->sample_rate); for (i = 0; i < 200; i++) { /* make sure the frame is writable -- makes a copy if the encoder * kept a reference internally */ ret = ffmpeg.av_frame_make_writable(frame); if (ret < 0) return 1; samples = (short*)frame->data[0]; for (j = 0; j < c->frame_size; j++) { samples[2 * j] = (short)(Math.Sin(t) * 10000); for (k = 1; k < c->channels; k++) samples[2 * j + k] = samples[2 * j]; t += tincr; } encode(c, frame, pkt, output); } /* flush the encoder */ encode(c, null, pkt, output); ffmpeg.av_frame_free(&frame); ffmpeg.av_packet_free(&pkt); ffmpeg.avcodec_free_context(&c); return 0; } static void encode(AVCodecContext* ctx, AVFrame* frame, AVPacket* pkt, BinaryWriter output) { int ret; /* send the frame for encoding */ ret = ffmpeg.avcodec_send_frame(ctx, frame); if (ret < 0) { Console.Error.WriteLine($"Error sending the frame to the encoder"); Environment.Exit(1); } /* read all the available output packets (in general there may be any * number of them */ while (ret >= 0) { ret = ffmpeg.avcodec_receive_packet(ctx, pkt); if (ret == ffmpeg.AVERROR(ffmpeg.EAGAIN) || ret == ffmpeg.AVERROR_EOF) return; else if (ret < 0) { Console.Error.WriteLine($"Error encoding audio frame"); Environment.Exit(1); } output.Write(new ReadOnlySpan<byte>(pkt->data, pkt->size)); ffmpeg.av_packet_unref(pkt); } } /* check that a given sample format is supported by the encoder */ static bool check_sample_fmt(AVCodec* codec, AVSampleFormat sample_fmt) { AVSampleFormat* p = codec->sample_fmts; while (*p != AVSampleFormat.AV_SAMPLE_FMT_NONE) { if (*p == sample_fmt) return true; p++; } return false; } /* just pick the highest supported samplerate */ static int select_sample_rate(AVCodec* codec) { int best_samplerate = 0; if (codec->supported_samplerates == null) return 44100; int* p = codec->supported_samplerates; while (*p != 0) { if (best_samplerate != 0 || Math.Abs(44100 - *p) < Math.Abs(44100 - best_samplerate)) best_samplerate = *p; p++; } return best_samplerate; } /* select layout with the highest channel count */ static ulong select_channel_layout(AVCodec* codec) { ulong* p; ulong best_ch_layout = 0; int best_nb_channels = 0; if (codec->channel_layouts == null) return ffmpeg.AV_CH_LAYOUT_STEREO; p = codec->channel_layouts; while (*p != 0) { int nb_channels = ffmpeg.av_get_channel_layout_nb_channels(*p); if (nb_channels > best_nb_channels) { best_ch_layout = *p; best_nb_channels = nb_channels; } p++; } return best_ch_layout; } }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/07/22 23:22依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。